2009-11-04 9 views
7

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

Ich habe in der PropertyInfo.GetValue() - Methode untersucht, aber es macht nicht viel Sinn in dem Kontext, den ich habe.

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

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

ich jetzt erkennen, dass der Wert einer Immobilie ist nicht immer so einfach. Was vermisse ich? Ich verstehe nicht wirklich, was ich an die GetValue() -Methode übergeben muss, weil ich einfach den Wert der Eigenschaft, auf die ich diese Methode anrufe, haben möchte.

Danke für jede Hilfe, die dies für mich erklärt. Ich habe hier ein paar Stunden verbracht, nur mit dem Kopf gegen den Schreibtisch geschlagen.

+2

Wie kompiliert das überhaupt? – Tinister

+2

Es tut es nicht. Es ist ein Beispiel dafür, was ich "möchte", nicht was der Code tatsächlich tut. :) –

Antwort

10

Sie müssen das spezifische Objekt schaffen, auf dem Sie die Eigenschaft in Frage stellen möchten:

prop.GetValue(item, null); 

Der Property ist nur metatdata über die Immobilie vom Typ, nicht auf die spezifische Objektinstanz. Die PropertyInfo weiß nicht, von welcher Instanz sie stammt (falls vorhanden) - nur der Typ/die Klasse, aus der sie stammt.

Sie können sich fast das PropertyInfo nur als den Namen der Eigenschaft vorstellen. Das ist nicht genug Informationen, um etwas damit allein zu tun - wir müssen dann sagen "Holen Sie den Wert der Eigenschaft mit diesem Namen auf ... was?" Auf dem Objekt, das wir bieten.

3

PropertyInfo steht für die Eigenschaftsmaschinerie selbst (Typ, Methode abrufen, Methode festlegen usw.), keine Eigenschaft, die an eine bestimmte Instanz gebunden ist. Wenn die Eigenschaft nicht statisch ist, müssen Sie eine Instanz angeben, von der diese Eigenschaft gelesen werden kann - das ist der erste Parameter für GetValue. Mit anderen Worten, wenn pi ist ein PropertyInfo, die die Test Eigenschaft auf einige Klasse und someObject ist eine Instanz dieser Klasse:

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

beide dort Zeilen den Wert der gleichen Eigenschaft auf dem gleichen Objekt erhalten. Wenn die Eigenschaft statisch ist, müssen Sie die Instanz offensichtlich nicht übergeben (übergeben Sie stattdessen null). Der zweite Parameter ist der Index für indizierte Eigenschaften - C# unterstützt keine indizierten Eigenschaften (er unterstützt Indexer, die nicht genau die gleichen sind), so dass Sie für diesen zweiten Parameter wahrscheinlich nie mehr als null übergeben müssen, außer Sie arbeiten mit einem Typ aus einer Assembly, der in einer Sprache geschrieben ist, die indizierte Eigenschaften unterstützt (wie VB, glaube ich).

Verwandte Themen