5

次のコードを検討してください。

public class Test
{
    private static readonly Lazy<Test> Lazy = new Lazy<Test>(() => new Test());

    private Test()
    {
        Console.WriteLine("Calling constractor");
    }

    public static Test Instance
    {
        get { return Lazy.Value; }
    }

    public void Something()
    {
    }
}

上記のクラスからインスタンスを作成する場合は、コンストラクターのアクセス修飾子をパブリックに変更し、このクラスからインスタンスを取得するために次のコードを記述します。

  Type type = typeof(Test);
        IEnumerable<Type> types = AppDomain.CurrentDomain.GetAssemblies().ToList()
                                           .SelectMany(s => s.GetTypes())
                                           .Where(type.IsAssignableFrom);
        Type strtegy = types.FirstOrDefault(x => x.IsClass);
        for (int i = 0; i < 10; i++)
        {
            Activator.CreateInstance(strtegy);
        }

このコードを使用する場合、その呼び出し Activator.CreateInstanceコンストラクターが呼び出すたびに、クラスのインスタンスが多数あります。

リフレクションでシングルトンクラスからインスタンスを取得するにはどうすればよいですか?

4

3 に答える 3

7

インスタンスを作成するには、コードで行うのと同じことを行い、次の値を取得しますInstance

var singleton = typeof(Test).GetProperty("Instance").GetValue(null);
于 2013-07-24T07:48:31.890 に答える
3

これを機能させるには、適切なフラグを GetProperty() に渡す必要があります。

var property = strtegy.GetProperty("Instance", BindingFlags.Public | BindingFlags.Static);
var instance = property.GetValue(null);
于 2013-07-24T07:54:56.760 に答える
0

コンストラクターを使用する必要はありません。プロパティにアクセスするだけです。

var value = typeof (Test).GetProperty("Instance").GetValue(null, null);
于 2013-07-24T07:49:17.680 に答える