2010-02-24 86 views
19

我有一個static classstatic private readonly成員通過該類的static constructor設置。以下是一個簡單的例子。是否可以使用反射來設置靜態類的靜態私有成員?

public static class MyClass 
{ 
    private static readonly string m_myField; 

    static MyClass() 
    { 
     // logic to determine and set m_myField; 
    } 

    public static string MyField 
    { 
     get 
     { 
      // More logic to validate m_myField and then return it. 
     } 
    } 
} 

由於上述類是一個靜態類,我不能爲了利用通這樣成FieldInfo.GetValue()調用來檢索創建它的一個實例,並在以後設置的m_myField值。有沒有一種方法我不知道要麼使用FieldInfo類來獲取和設置靜態類的值,要麼是唯一的選擇是重構我被要求單元測試的類?

+3

爲什麼會你想要一個實例去反射信息?只需說'typeof(MyClass)',然後進入反射API的有趣位... – flq 2010-02-24 22:15:59

+0

+1,如果它是這樣的話,我會接受答案,因爲我完全沒有意識到Type可以用於Get/SetValue並不一定是類本身的一個實例。謝謝 – JamesEggers 2010-02-24 22:21:35

回答

32

這裏是展示如何做到這一點一個簡單的例子:

using System; 
using System.Reflection; 

class Example 
{ 
    static void Main() 
    { 
     var field = typeof(Foo).GetField("bar", 
          BindingFlags.Static | 
          BindingFlags.NonPublic); 

     // Normally the first argument to "SetValue" is the instance 
     // of the type but since we are mutating a static field we pass "null" 
     field.SetValue(null, "baz"); 
    } 
} 

static class Foo 
{ 
    static readonly String bar = "bar"; 
} 
+0

這是否違反了「私人」訪問控制? – athos 2011-07-07 09:46:15

+10

通常在任何時候你使用反射它是違反一些法律:) – SamuelWarren 2012-02-20 15:39:13

0

這種「空規則」同樣適用於FieldInfo.GetValue()的靜態字段,例如,

Console.Writeline((string)(field.GetValue(null))); 
+0

僅供參考 - 這應該是對原始答案的評論。這是作爲答案發布的,並不直接回答如何在靜態成員上設置值的原始問題。這是分享的好信息,它只是作爲解釋如何解決OP原始問題的答案的評論 – 2017-02-24 17:50:39