Dies ist mein allererster Beitrag, und obwohl ich in Themen zu meinem Problem in gewissem Umfang gesucht habe, habe ich eine Menge Probleme bei der Suche nach der richtigen Antwort.Erstellen Sie ein neues PropertyInfo-Objekt im laufenden Betrieb
Meine Frage kann sehr einfach sein, aber ich bin mir bewusst, dass die Antwort nicht so einfach zu geben ist. Wenn überhaupt etwas existiert.
Mit diesem wird gesagt, das ist mein Fall: als Beispiel, ich habe eine Reihe von Propertyinfo-Objekte, die ich die Eigenschaften von einer Klasse zu erhalten verwende, wie folgt aus:
public PropertyInfo[] GetProperties (object o)
{
PropertyInfo[] properties = o.GetType().GetProperties();
return properties;
}
Sieht einfach aus , Recht? Jetzt ist mein Problem das: wie ein neues PropertyInfo-Objekt erstellen und es dem Array hinzufügen?
Ich habe andere Beiträge gesehen, wo Benutzer den Wert einer PropertyInfo festlegen möchten, aber das ist nicht was ich brauche. Was ich brauche, ist im Handumdrehen ein neues PropertyInfo-Objekt zu erstellen, wobei die einzigen verfügbaren Daten, die ich habe, die Name und die Type sind.
Der Testfall, den ich zuvor veröffentlicht habe, ist nur ein kleines Beispiel dessen, was ich erreichen möchte. Meine wahre und endgültige Ziel ist, in der Tat, auf dieser Klasse eine neue Property Basis zu schaffen, in der Lage sein:
public class DynamicClass
{
public Type ObjectType { get; set; }
public List<string> PropertyNameList { get; set; }
public List<Type> PropertyTypeList { get; set; }
}
Ich hoffe jemand kann mir helfen, dies zu erreichen. Vielen Dank im Voraus!
EDITED: Ich habe vergessen, o.GetType() vor GetProperties() -Methode hinzuzufügen. Danke Ilja Iwanow!
Ich rufe die Methode SelectProperties wie so:
list = _queriable.Select(SelectProperties).ToList();
Das Verfahren sieht wie folgt aus:
private Expression<Func<T, List<string>>> SelectProperties
{
get
{
return value => _properties.Select
(
prop => (prop.GetValue(value, new object[0]) ?? string.Empty).ToString()
).ToList();
}
}
Mit freundlichen Grüßen,
Luis
AKTUALISIEREN:
Ok, also befolge ich den 280Z28-Rat und erwerbe PropertyInfo in einer neuen Klasse. Ich habe mehr Untersuchungen durchgeführt und in MSDN festgestellt, dass ich die folgenden Methoden überschreiben muss: GetValue, SetValue, GetAccessors, GetGetMethod, GetSetMethod und GetIndexParameters.
Wenn ich jedoch versuche, Base mit den Parametern aufzurufen, gibt es mir einen Fehler und ich zitiere "Kann ein abstraktes Mitglied nicht aufrufen: 'System.Reflection.PropertyInfo.GetAccessors (bool)'". Wenn ich versuche, die Methode ohne Parameter aufzurufen, wird kein Fehler angezeigt, aber ich denke, das ist der falsche Ansatz.
Dies ist, was ich bisher habe:
public override MethodInfo[] GetAccessors(bool nonPublic)
{
MethodInfo[] temp = base.GetAccessors(nonPublic);
return temp;
}
UPDATE 2:
Ok, das ist nicht gut funktionierte. Nach einigen Stunden, in denen ich versucht habe, die abgeleitete Klasse von PropertyInfo oder PropertyDescriptor auszuführen, habe ich mich entschieden, diesen Ansatz nicht durchzuführen.
Stattdessen hatte ich eine andere Idee aus dem Lesen anderer Beiträge. Mein wahres Problem liegt in der Tatsache, dass die Klasse, die ich normalerweise lese und verwende, um die Eigenschaften zu erhalten, nicht immer die gleiche ist. So realisierte ich, was ich wahrscheinlich wirklich brauche, ist nur eine Möglichkeit, eine dynamische Klasse on the fly zu erstellen, und nur dann erhalten Sie die Eigenschaften.
Ich habe gelesen, dass es so etwas wie ExpandoObject und ElasticObject gibt, obwohl ich noch nicht ganz weiß, wie man sie auf mein Problem anwendet, um endlich eine Lösung zu bekommen.
Ok jetzt, was ich wirklich tun, ist dies -> Ich habe in den folgenden Link unter Verwendung der Lösung genannt: jQuery DataTables Plugin Meets C#.
Die Sache ist, Dies setzt voraus, ich verschiedene statische Modelle/Klassen für jede DB haben Tabelle. In meinem Fall werde ich jedoch zwei Arten von Spalten haben: Die, die von jeder DB-Tabellenklasse (aka Basisspalten) zur Verfügung gestellt werden, und dann zusätzliche Spalten, die ich bereits dynamisch in meiner Anpassung bereitstelle.
Zum Beispiel: dies, wenn die DB-Tabellenklasse:
public class Table1
{
public int Field1;
public string Field2;
public string Field3;
}
Und dann liefere ich eine zusätzliche Spalte „Aktion“ vom Typ String, dann in der DataTableParser Klasse aufgerufen, in dem _properties attribure es sollte die folgenden Angaben:
_properties[0] should be int32 Field1
_properties[1] should be String Field2
_properties[2] should be String Field3
_properties[3] should be String Action
Und um ehrlich zu sein, dass ALL ist ich brauche! Nicht mehr, nicht weniger! Den Rest analysiere ich schon!
Am Ende, da ich eine andere Anzahl von Spalten (geliefert) als das Objekt an die DataTableParser-Klasse übergeben haben, gibt es immer Fehler beim Sortieren und Filtern der DataTable.
Irgendwelche Hilfe bitte? Ich brauche es wirklich! Danke noch einmal.
Mit freundlichen Grüßen,
Luis
normalerweise gehen Sie durch 'aType.GetProperties'. –
'typeof (o)' dies wird nicht kompiliert. Wahrscheinlich meinst du 'o.GetType(). GetProperties()' –
Wie willst du dieses Objekt, das du erstellen willst, benutzen? – Andrei