2009-06-05 7 views
1

Je veux fournir un "objet" inconnu et retourner la valeur de l'un de ses membres. La réponse est requise en C#.Easy Réflexion question C#

Génériquement Je suppose que je suis à la recherche du code à cette méthode objet public static GetObjectMemberValue (objet myObject, chaîne nomMembre)

Plus précisément, je fais cela pour les chaînes de ressources dans Silverlight et le besoin d'écrire ce méthode. Il réside dans un projet commun est utilisé contre quelques dictionnaires Resx différents, donc je n'ai pas accès à l'information de type. chaîne statique publique GetString (objet StringResources, chaîne ResourceId)

Merci!

Répondre

5

Cela va obtenir votre valeur ... Pouvez-vous me donner plus d'informations dans la partie resx de la question?

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

C'est tout ce que je avais besoin. Merci Russau. La partie resx est un hack qui ne vaut pas la peine d'être expliqué. C'est juste une solution de contournement que j'ai créée parce que Silverlight 2.0 ne me permet pas d'inclure des dictionnaires de ressources (xaml) dans plusieurs projets de bibliothèque de classe Silverlight. Les dictionnaires fusionnés ont été pris en charge dans Silverlight 3.0 et lorsque je migre, je peux me débarrasser de ce hack. La réflexion est cool mais je suis tout à fait d'accord avec certains des autres commentaires car il faut éviter de pouvoir taper fortement un objet. – Justin

1

si vous connaissez le type d'objet, puis de lancer la conversion?

Ou devrait-il au moins implémenter une interface si vous ne connaissez pas le type explicite?

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

d'abord obtenir le type de l'objet:

type = myObjectType myObject.GetType();

Ensuite, vous pouvez utiliser le returned Type object pour obtenir les informations de la propriété, puis sa valeur.

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

s'il vous plaît ne pas écrire des méthodes d'extension sur l'objet. Créez une interface et écrivez la méthode d'extension sur cela. – Robert

+0

Je suis d'accord avec vous, c'est la bonne façon de le faire. – jason

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