web-dev-qa-db-ja.com

静的コンストラクターを明示的に呼び出す

以下のクラスの単体テストを書きたいのですが。
名前が「MyEntity」以外の場合、mgrは空白にする必要があります。
負の単体テスト
Managerプライベートアクセサを使用して、名前を「Test」に変更して、mgrがnullになるようにします。そして、mgr値を検証します。これを実現するために、静的コンストラクターを明示的に呼び出したいのですが、静的コンストラクターを呼び出すときに

Manager_Accessor.name = "Test"
typeof(Manager).TypeInitializer.Invoke(null, null); 

nameは常に「MyEntity」に設定されます。nameを「Test」に設定し、静的コンストラクターを呼び出す方法。

public class Manager
{        
        private static string name= "MyEntity";

        private static object mgr;

        static Manager()
        {
            try
            {
                mgr = CreateMgr(name);
            }
            catch (Exception ex)
            {
                mgr=null;
            }
        }
}
33
meetjaydeep

今日見つけたように、静的コンストラクタは直接呼び出すことができます:

from 別のStackoverflowポスト

他の答えはすばらしいですが、型への参照(つまりリフレクション)なしでクラスコンストラクターを強制的に実行する必要がある場合は、以下を使用できます。

Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);  

このコードをアプリケーションに追加する必要がありました 。net 4.0 CLRで発生する可能性のあるバグを回避するため

40
Tobias Knauss

このスレッドを見つけて不思議に思う人のために...私はテストをしました。 System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor()notが別の理由ですでに実行されている場合にのみ静的コンストラクターを実行するようです。

たとえば、以前のコードがクラスにアクセスして静的コンストラクターをトリガーしたかどうかに関係なく、コードがポジティブでない場合は問題ではありません。その以前のアクセスによって静的コンストラクターが実行されますが、RunClassConstructor()はそれを実行しません。 RunClassConstructor()は、まだ実行されていない場合にのみ静的コンストラクターを実行します。

RunClassConstructor()の後にクラスにアクセスするとnotも実行され、静的コンストラクタが2回実行されます。

これは、Win10 UWPアプリでのテストに基づいています。

4
kburgoyne

クラスに静的メンバーがある場合(存在する必要があります。そうでない場合、静的コンストラクターはあまり機能しません)、静的コンストラクターを明示的に呼び出す必要はありません。

静的コンストラクターを呼び出したいクラスにアクセスするだけです。例えば。:

public void MainMethod()
{
    // Here you would like to call the static constructor

    // The first access to the class forces the static constructor to be called.
    object temp1 = MyStaticClass.AnyField;

    // or
    object temp2 = MyClass.AnyStaticField;
}
4
Mitulát báti

public static void Initialize(){}メソッドを静的クラスに追加し、必要なときに呼び出すだけです。静的コンストラクターが自動的に呼び出されるため、これは呼び出しコンストラクターと非常に似ています。

1
user3432147

コンストラクターで呼び出すコードをパブリックメソッドに入れ、コンストラクターから呼び出します

0
hngr18