Отражение C # - Приведение частного объекта - PullRequest
1 голос
/ 31 марта 2010

У меня есть следующие классы:

public class MyEventArgs : EventArgs
{
    public object State;

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

}

public class MyClass
{
     // ...

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

Когда я поднимаю свое событие, я устанавливаю «State» объекта MyEventArgs для объекта типа MyClass.Я пытаюсь получить ErrorMessages путем отражения в моем обработчике событий:

 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);

  }

Но это возвращает errorMessagesInfo как ноль (даже если stateInfo не нуль).Возможно ли получить ErrorMessages?

Редактировать: я должен уточнить, что обработчик событий находится в другой сборке, и я не могу ссылаться на первую сборку (которая содержит MyEventArgs и MyClass) для проблем сборки.1010 * Спасибо

Редактировать: Решение

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;

Ответы [ 4 ]

2 голосов
/ 31 марта 2010

Для этого вам не нужно отражение, просто приведите EventArgs к MyEventArgs, и тогда вы сможете получить доступ к свойству 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....
 } 

Вы должны избегать использования отражения для чего-то, где их типы полностью известны. Вместо этого вы должны использовать приведение типов для преобразования ссылки в ожидаемые вами типы. Отражение имеет смысл, когда информация о типе является динамической или недоступной во время компиляции в вашем коде (а это не так).

1 голос
/ 31 марта 2010

Пример ....

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);
0 голосов
/ 31 марта 2010

Решение:

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 голосов
/ 31 марта 2010

Вам необходимо передать экземпляр MyClass:

errorMessagesInfo.GetValue(someInstanceOfMyClass, null);

Если отправитель имеет тип MyClass, это будет означать:

errorMessagesInfo.GetValue(sender, null);
...