2013-02-06 26 views
3

說我有這個C#類C#如何使用反射調用字段初始值設定項?

public class MyClass { 
    int a; 
    int[] b = new int[6]; 
} 

現在說我使用反射發現這個類,並在注視場我發現其中有一個是數組類型(即:B)

foreach(FieldInfo fieldinfo in classType.GetFields()) 
{ 
    if(fieldInfo.FieldType.IsArray) 
    { 
     int arraySize = ?; 
     ... 
    } 
} 

我知道它不能保證數組有一個字段初始值設定項來創建數組,但是如果它有,我想知道由字段初始值設定項創建的數組的大小。

有沒有辦法調用字段初始值設定項?

如果有,我會做這樣的事情:

Array initValue = call field initializer() as Array; 
int arraySize = initValue.Length; 

唯一的是,我發現是創建整個類的實例,但因爲它是大材小用,我寧願不做這樣的...

+0

什麼是不需要整個班級的用例? –

+0

您將不得不深入構造函數的MethodBody來檢查。 – leppie

回答

0

我不認爲你有一個選擇,但創建類的實例,因爲它不存在,直到你這樣做。

+0

他可以根據該方法找出問題,並使用某種形式的IL反射來解決問題,在我看來,這是100倍多的矯枉過正。但它在技術上是一種選擇。 – Aron

3

嗯,你不能。

下面的代碼:

public class Test 
{ 
    public int[] test = new int[5]; 

    public Test() 
    { 
     Console.Read(); 
    } 
} 

將被編譯爲:

public class Program 
{ 
    public int[] test; 

    public Program() 
    { 
     // Fields initializers are inserted at the beginning 
     // of the class constructor 
     this.test = new int[5]; 

     // Calling base constructor 
     base.ctor(); 

     // Executing derived class constructor instructions 
     Console.Read(); 
    } 
} 

所以,直到你創建類型的實例,也沒有辦法知道數組的大小。

+0

這不完全是因爲他們在文檔中說在調用構造函數之前執行了字段初始值設定項。 –

+0

@ user1857628我正在考慮**實例**字段(而不是靜態),並且您提供的情況並不意味着繼承。字段初始值設定項在** base **構造函數之前執行,而不是大多數派生類的構造函數。我在示例中添加了對基礎構造函數的調用,使其更加清晰。 – ken2k

相關問題