2010-03-30 89 views
1

我有以下類別:C#反思 - 鑄造專用對象字段

public class MyEventArgs : EventArgs 
{ 
    public object State; 

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

} 

public class MyClass 
{ 
    // ... 

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

當我提出我的活動,我設置「國」 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)的構建問題。

謝謝

編輯:解決方案

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

解決方案:

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

你需要傳遞的MyClass實例:

errorMessagesInfo.GetValue(someInstanceOfMyClass, null); 

如果發件人是MyClass類型的,這將意味着:

errorMessagesInfo.GetValue(sender, null); 
+0

謝謝,但我沒有MyClass的實例。另外,發件人是不同類別的對象。 – alhazen 2010-03-30 22:26:45

2

你不需要思考這個,只投EventArgsMyEventArgs,然後你可以訪問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.... 
} 

您應該避免使用反射的東西,他們類型是完全清楚。相反,您應該使用類型轉換將引用轉換爲您期望的類型。如果類型信息是動態的,或者在編譯時在代碼中不可用(反映情況並非如此),則反射很有意義。

+0

OnEventEnded()在另一個程序集中,我不能簡單地引用包含MyEventArgs和MyClass的程序集。謝謝 – alhazen 2010-03-30 22:24:25

1

一個例子....

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