2011-08-18 80 views
0

任何人都可以幫助我嗎?C#:使用反射來訪問類中的所有字段,返回錯誤

我有一些反射代碼,我寫了,它似乎工作正常,但它試圖將「this」傳遞給GetValue時給我一個錯誤。

我有點卡住了,我認爲問題在於我在frmMain中運行反射代碼,並且在另一個項目中定義了AbCCompany,但我有一個參考。

我得到錯誤

字段「AbcCompany」上型「MyApp.Companies.Config」定義不是目標對象,它是類型上的 字段「MyApp.frmMain」。

這裏是代碼..

 var companies = MyIems.Companies.GetType().GetFields(); 


     foreach (var list in companies) 
     { 

      List<CompanyBase> thisCompanyCollection = (List<CompanyBase>)list.GetValue(this); 
      foreach (var company in thisCompanyCollection) 
      { 
       Console.WriteLine(); 
      } 
     } 

編輯

我忘了提,內部「公司」是許多名單,其中xxx是一個類..所有的類繼承的CompanyBase。即AbcCompany

+0

請出示MyItems.Companies'的'領域和CompanyBase'的'的聲明。 – Yahia

回答

4

而不是通過thisGetValue您需要通過MyApp.Companies.Config的實例。

如果你看看the documentation,你可以看到你得到的異常是因爲obj參數不是該類型的聲明(或從中繼承)當前字段被聲明。

假設MyApp.Companies.Config有一個參數的構造函數,下面應該工作:

var type = MyItems.Companies.GetType(); 

var instance = type.GetConstructor(System.Type.EmptyTypes).Invoke(null); 

foreach(var list in type.GetFields()) 
{ 
    List<CompanyBase> thisCompanyCollection = (List<CompanyBase>)list.GetValue(instance); 
    foreach(var company in thisCompanyCollection) 
    { 
     Console.WriteLine(company); 
    } 
} 
+0

@Kragen你是什麼意思? –

+0

提供的代碼示例說MyItems.Companies.GetType()','GetType'是一個實例方法而不是靜態方法,所以'Companies'是一個變量,'MyItems'可能也是。異常消息指出類型名稱是「MyApp.Companies.Config」,它是「MyItems.Companies」的一個實例。 –

+0

嗯,是的,不理我! – Justin