簡體   English   中英

如何使用反射調用靜態構造函數?

[英]How do I invoke a static constructor with reflection?

如何獲取靜態構造函數的ConstructorInfo

public class MyClass
{
    public static int SomeValue;

    static MyClass()
    {
        SomeValue = 23;
    }
}

我試過以下但失敗了....

 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);

使用myClass.TypeInitializer.Invoke(null, null)

我剛試過這個,它運行正常。

但我強烈建議您要這樣做 - 它違反了一種類型,期望靜態構造函數只執行一次。 如果你只是想確保一個類被初始化,請按照Oliver的回答使用RuntimeHelpers.RunClassConstructor

還有System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(RuntimeTypeHandle type) ,它還保證靜態構造函數只被調用一次,無論調用該方法的次數如何:

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

參考

盡管有可能,但這樣做可能不是一個好主意。 但是,如果訪問該類的任何成員,運行時將自動為您調用靜態構造函數。 例如:

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

由於訪問類的字段不會導致任何副作用(除了初始化類和調用靜態構造函數),這通常是一種相對安全的方法(但是,它只能用於類)用一些靜態字段)。 這樣做的好處是它可以保證最多只調用一次類型構造函數這非常重要。

你也嘗試過BindingFlags.Private嗎?

注意,靜態構造函數在任何調用此類的任何其他實例或靜態方法之前都保證調用get,並且保證它是線程安全的並且只調用一次。

如果你明確地用反射來調用它,你可能會造成很大的傷害。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM