2009-06-05 28 views
1

Ich möchte unbekanntes "Objekt" liefern und den Wert eines seiner Mitglieder zurückgeben. Antwort ist in C# erforderlich.Einfache Reflektion Frage C#

generisch Ich glaube, ich bin für den Code zu dieser Methode public static Objekt GetObjectMemberValue (Objekt myObject, string member) suchen

Insbesondere das mache ich für Ressourcen-Strings in Silverlight und müssen dies schreiben Methode. Es befindet sich in einem gemeinsamen Projekt wird gegen ein paar verschiedene Resx-Wörterbücher verwendet, so habe ich keinen Zugriff auf die Typinformationen. öffentliche statische Zeichenfolge GetString (Objekt StringResources, Zeichenfolge ResourceId)

Vielen Dank!

Antwort

5

Dies wird Ihren Wert bekommen ... Können Sie mir mehr Informationen im resx Teil der Frage geben?

public static object GetObjectMemberValue(object myObject, string memberName) 
{ 
    PropertyInfo dateProperty = myObject.GetType().GetProperty(memberName); 
    return dateProperty.GetValue(myObject, null); 
} 
+0

Das alles, was ich gebraucht wird. Danke Russau. Der Resx-Teil ist ein Hack, den es nicht zu erklären lohnt. Es ist nur eine beschissene Problemumgehung, die ich erstellt habe, weil Silverlight 2.0 es mir nicht erlaubt, Ressourcenwörterbücher (xaml) über mehrere Silverlight-Klassenbibliotheksprojekte hinweg aufzunehmen. Zusammengefasste Wörterbücher wurden in Silverlight 3.0 unterstützt, und wenn ich migriere, kann ich diesen Hack loswerden. Reflektion ist cool, aber ich stimme einigen anderen Kommentaren völlig zu, dass es vermieden werden sollte, wenn man ein Objekt stark eintippen kann. – Justin

1

Wenn Sie den Objekttyp kennen, dann umwandeln?

Oder sollte es zumindest eine Schnittstelle implementieren, wenn Sie den expliziten Typ nicht kennen?

MyType value = (MyType)objectGetter() //this is the function that returns the unknown. 
value.GetMember() 
0

zunächst die Art des Objekts erhalten:

Typ myObjectType = myObject.GetType();

Dann können Sie die returned Type object verwenden, um die Informationen der Eigenschaft zu erhalten, und dann ist es Wert.

1
static class ObjectExtensions { 
    public static object GetObjectPropertyValue(this object o, string propertyName) { 
     return o.GetType().GetProperty(propertyName).GetValue(o, null); 
    } 
} 

class Test { 
    public string Message {get; set;} 
} 

class Program { 
    static void Main(string[] args) { 
     object t = new Test { Message = "Hello, World!" }; 
     Console.WriteLine(t.GetObjectPropertyValue("Message").ToString()); 
    } 
} 
+0

Bitte schreiben Sie keine Erweiterungsmethoden für das Objekt. Erstellen Sie eine Schnittstelle und schreiben Sie die Erweiterungsmethode darauf. – Robert

+0

Ich stimme dir zu, das ist der richtige Weg. – jason

0
o.GetType().InvokeMember("MemberName", BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, o, null);