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 回答