2010-03-30 8 views
1

Je les classes suivantes:C# Réflexion - Coulée champ Objet privé

public class MyEventArgs : EventArgs 
{ 
    public object State; 

    public MyEventArgs (object state) 
    { 
     this.State = state; 
    } 

} 

public class MyClass 
{ 
    // ... 

    public List<string> ErrorMessages 
    { 
      get 
      { 
       return errorMessages; 
      } 
     } 
} 

Quand je lève mon cas, je mis « Etat » des MyEventArgs objet à un objet de type MyClass. Je suis en train de récupérer ErrorMessages par réflexion dans mon gestionnaire d'événements:

public static void OnEventEnded(object sender, EventArgs args) 
{ 
     Type type = args.GetType(); 
     FieldInfo stateInfo = type.GetField("State"); 
     PropertyInfo errorMessagesInfo = stateInfo.FieldType.GetProperty("ErrorMessages"); 

     object errorMessages = errorMessagesInfo.GetValue(null, null); 

    } 

Mais retourne errorMessagesInfo comme nulle (même si stateinfo est non nulle). Est-il possible de récupérer ErrorMessages? Editer: Je dois préciser que le gestionnaire d'événements est dans un assembly différent, et je ne peux pas référencer le premier assembly (qui contient MyEventArgs et MyClass) pour les problèmes de construction.

Merci

Edit: Solution

FieldInfo stateInfo = args.GetType().GetField("State"); 
Object myClassObj = stateInfo.GetValue(args); 
PropertyInfo errorMessagesInfo = myClassObj.GetType().GetProperty("ErrorMessages"); 
object errorMessagesObj = errorMessagesInfo.GetValue(myClassObj, null); 
IList errorMessages = errorMessagesObj as IList; 

Répondre

0

Solution:

FieldInfo stateInfo = args.GetType().GetField("State"); 
Object myClassObj = stateInfo.GetValue(args); 
PropertyInfo errorMessagesInfo = myClassObj.GetType().GetProperty("ErrorMessages"); 
object errorMessagesObj = errorMessagesInfo.GetValue(myClassObj, null); 
IList errorMessages = errorMessagesObj as IList; 
0

Vous devez passer l'instance de MyClass:

errorMessagesInfo.GetValue(someInstanceOfMyClass, null); 

Si l'expéditeur est de type MyClass qui signifierait:

errorMessagesInfo.GetValue(sender, null); 
+0

Merci, mais je n'ai pas une instance de MyClass. En outre, l'expéditeur est un objet d'une classe différente. 0E04E ( – alhazen

2

Vous n'avez pas besoin de réflexion pour cette, juste jeter EventArgs à MyEventArgs et vous pouvez accéder à la propriété ErrorMessages:

public static void OnEventEnded(object sender, EventArgs args) 
{ 
    MyEventArgs myArgs = (MyEventArgs)args; 
    MyClass detail = (MyClass)myArgs.State; 

    // now you can access ErrorMessages easily... 
    detail.ErrorMessages.... 
} 

Vous devriez éviter d'utiliser la réflexion pour quelque chose où ils types sont parfaitement connus. Au lieu de cela, vous devez utiliser cast de type pour convertir la référence aux types que vous attendez. La réflexion prend tout son sens lorsque les informations de type sont dynamiques ou non disponibles au moment de la compilation dans votre code (ce qui ne semble pas être le cas).

+0

) OnEventEnded() se trouve dans un autre assembly et je ne peux pas simplement référencer l'assembly contenant MyEventArgs et MyClass. Merci – alhazen

1

Un exemple ....

PropertyInfo inf = ctl.GetType().GetProperty("Value"); 
errorMessagesInfo.GetValue(ClassInstance, null); 




//And to set a value 
    string value = reader[campos[i]].ToString(); 
    inf.SetValue(ctl, value, null);