2010-02-24 17 views
19

static constructor aracılığıyla ayarlanan static private readonly üyesi olan bir static class sahibim. Aşağıda basitleştirilmiş bir örnek. Yukarıdaki sınıf statik sınıf olduğundanStatik bir sınıfın statik özel üyesini yansıma ile ayarlamak mümkün mü?

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. 
     } 
    } 
} 

, ben almak için FieldInfo.GetValue() çağrısında böyle pas yararlanmak için bunun bir örneğini oluşturmak ve daha sonra m_myField değerini belirleyemezsiniz. StatInfo sınıfındaki değeri almak ve ayarlamak için FieldInfo sınıfını kullanmanın ya da birim sınaması için sorduğum sınıfı yeniden yönlendirmenin tek seçeneğidir farkında olmamın bir yolu var mı?

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"; 
} 
+3

Neden mü: Burada – flq

+0

+1 ve eğer böyle bir yanıtı kabul edersem tam olarak farketmedim. SetValue ve sınıfın kendisinin bir örneği olmak zorunda değildir. Teşekkürler – JamesEggers

cevap

32

bunu nasıl gösteren bir hızlı örnektir yansıma bilgisine ulaşmak için bir örnek ister misin? sadece "tipeof" (MyClass) `deyin ve kapalı yansıma API'sinin eğlenceli bitlerine gidin ...
+0

Bu "özel" erişim denetiminin ihlali midir? – athos

+10

Genellikle, yansıma kullandığınız zaman, bu, bazı yasaların ihlali anlamına gelir :) – SamuelWarren

0

Bu "boş kural" da statik bir alan için FieldInfo.GetValue() için de geçerlidir, örneğin

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

FYI - Bu, orijinal yanıtın bir yorumu olmalıydı. Bu bir yanıt olarak yayınlandı ve statik bir üye üzerinde bir değer nasıl ayarlanacağı asıl soruya doğrudan cevap vermiyor. Paylaşmak için iyi bir bilgi, sadece OP'in orijinal sorununa nasıl çözüleceğini açıklayan bir cevap olarak yorumlanmış olmalıydı. –

İlgili konular