2010-03-26 15 views
12

Statik kurucu için ConstructorInfo'u nasıl alabilirim?Statik bir kurucuyu yansımayla nasıl çağırırım?

public class MyClass 
{ 
    public static int SomeValue; 

    static MyClass() 
    { 
     SomeValue = 23; 
    } 
} 

denedim Kullanım myClass.TypeInitializer.Invoke(null, null) ....

Type myClass = typeof (MyClass); 

// throws exception 
myClass.TypeInitializer.Invoke(null);  

// returns null (also tried deleting BindingFlags.Public 
ConstructorInfo ci = myClass.GetConstructor(BindingFlags.Static|BindingFlags.Public, System.Type.DefaultBinder, System.Type.EmptyTypes, null); 

// returns empty array 
ConstructorInfo[] clutchingAtStraws = myClass.GetConstructors(BindingFlags.Static| BindingFlags.Public); 

cevap

27

takip başarısız oldu.

Bunu denedim ve iyi çalıştı.

'un yapmamasını kesinlikle öneririm, ancak statik yapıcının yalnızca bir kez yürütülmesini bekleyen bir türü ihlal eder. Bir sınıfın başlatıldığından emin olmak için Oliver's answer uyarınca RuntimeHelpers.RunClassConstructor kullanın.

+0

+1 teşekkür Jon! Cevap şu an çok açık görünüyor * grin * –

+0

[PostSharp kullanarak bir yön uygulamak için] [http://www.sharpcrafters.com/] adresine erişmek için ona ihtiyacım vardı. Sanırım hala geçerli bir kullanım vakası. –

+2

Düşündüm, çünkü bir sonraki cevap (en azından teoride) çok daha güvenli. p.s. Lanet olsun, Jon Skeet'in yanıtını reddettim. Ben cesur değil miyim? –

2

BindingFlags.Private'ı da denediniz mi?

Not: Statik kurucunun, herhangi bir başka örneği veya bu sınıfın statik yöntemlerini çağırmadan önce çağrılanın garanti edildiğini ve iş parçacığı olarak güvenli ve tam olarak bir kez çağrılması garanti edildiğini unutmayın.

açıkça size zarar bir sürü yapabileceği yansıma ile arama ediyorum Eğer

.. bu mümkün olsa

7

, bunu yapmak için iyi bir fikir olmayabilir. Bununla birlikte, sınıfın herhangi bir üyesine erişirseniz, çalışma zamanı sizin için statik yapıcıyı otomatik olarak çağırır. Örneğin: sınıfının bir alana erişim (sınıfın başlatma dışındaki ve statik yapıcısına çağrı) Herhangi bir yan etki neden olamaz yana

// Read the field 'SomeValue', so that the runtime invokes static ctor 
Type myClass = typeof(MyClass); 
myClass.GetField("SomeValue").GetValue(null); 

, bu genel olarak bunu yapmanın bir nispeten güvenli yolu olmalı (Ancak, sadece bazı statik alanlı sınıflar için çalışacaktır). Bu, tip kurucunun en çok numaralı telefondan çok önemli olan numaralı telefona çağrılmasını garanti etmesinin yararına sahiptir.

+1

Garip, ama bu soruya geldim çünkü sadece ihtiyaç duyduğum alana, eriştiğim sırada başlanmadı. Bahse girerim, çoğu insan aynı sebepten dolayı buradadır. –

23

yöntemi denir bakılmaksızın kaç kez, ayrıca statik yapıcı yalnızca bir kez denir garanti, hangi da System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type) vardır:

Type myClass = typeof(MyClass); 
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(myClass.TypeHandle); 

Reference

+5

Gerçek doğru cevap budur. Bu hayatımı belirli bir ölümden kurtardı !! – Xtro

İlgili konular