7 Stimmen

Eigenschaftswert dynamisch abrufen

Ich habe ein Objekt, das eine große Anzahl von Eigenschaften hat. Ich möchte den Wert jeder dieser Eigenschaften abrufen, indem ich einfach eine Schleife durch die Eigenschaftensammlung des Objekts ziehe.

Ich habe in der PropertyInfo.GetValue()-Methode jedoch es ist nicht viel Sinn in den Kontext, den ich habe angesehen.

Hier ist ein Beispiel für das, was ich zu tun versuche (dieser Code funktioniert nicht btw):

foreach(var item in dataObjects)
  {
    foreach(PropertyInfo prop in item.GetType().GetProperties())
    {
      String value = prop.GetValue().ToString()
    }
  }

Ich weiß jetzt, dass es nicht so einfach ist, den Wert einer Immobilie zu ermitteln. Was übersehe ich? Ich verstehe nicht wirklich, was ich der Methode GetValue() übergeben muss, weil ich einfach den Wert der Eigenschaft haben möchte, für die ich diese Methode aufrufe.

Vielen Dank für jede Hilfe zur Klärung dieser Frage. Ich habe ein paar Stunden damit verbracht, meinen Kopf gegen den Schreibtisch zu schlagen.

10voto

Rex M Punkte 138455

Sie müssen das spezifische Objekt angeben, für das Sie die betreffende Eigenschaft aufrufen möchten:

prop.GetValue(item, null);

Die PropertyInfo enthält lediglich Metadaten über die Eigenschaft zum Typ und nicht auf die spezifische Objektinstanz. Die PropertyInfo weiß nicht, von welcher Instanz sie stammt (falls vorhanden) - nur von welchem Typ/welcher Klasse sie stammt.

Man kann sich die PropertyInfo fast nur als den Namen der Eigenschaft vorstellen. Das ist nicht genug Information, um damit allein etwas zu tun - wir müssen dann sagen: "Hole den Wert der Eigenschaft mit diesem Namen am... Was? " Auf dem Objekt bieten wir.

3voto

PropertyInfo steht für die Eigenschaftsmaschinerie selbst (Typ, Get-Methode, Set-Methode usw.) und nicht für eine Eigenschaft, die an eine bestimmte Instanz gebunden ist. Wenn die Eigenschaft nicht statisch ist, müssen Sie eine Instanz angeben, aus der diese Eigenschaft gelesen werden soll - das ist der erste Parameter von GetValue. Mit anderen Worten, wenn pi es un PropertyInfo die den Test Eigenschaft für eine Klasse und someObject ist eine Instanz dieser Klasse:

object a = someObject.Test;
object b = pi.GetValue(someObject, null);

beide Zeilen dort erhalten den Wert derselben Eigenschaft für dasselbe Objekt. Wenn die Eigenschaft statisch ist, brauchen Sie die Instanz natürlich nicht zu übergeben (übergeben Sie stattdessen null). Der zweite Parameter ist der Index für indizierte Eigenschaften - C# unterstützt keine indizierten Eigenschaften (es unterstützt Indexer, die nicht genau dasselbe sind), so dass Sie wahrscheinlich nie etwas anderes als null für den zweiten Parameter übergeben müssen, es sei denn, Sie arbeiten mit einem Typ aus einer Baugruppe, die in einer Sprache geschrieben wurde, die indizierte Eigenschaften unterstützt (wie VB, ich glaube).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X