考虑以下代码:
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()
{
}
}
当我想从上面的类创建实例时,我们应该将构造函数的访问修饰符更改为public,对于此类的get实例,我编写此代码:
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
构造函数都应该调用。所以我们有很多类的实例。
如何从具有反射的单例类中获取实例?
答案 0 :(得分:5)
要创建实例,请执行与代码相同的操作 - 获取Instance
的值:
var singleton = typeof(Test).GetProperty("Instance").GetValue(null);
答案 1 :(得分:2)
您需要将适当的标志传递给GetProperty()以使其工作:
var property = strtegy.GetProperty("Instance", BindingFlags.Public | BindingFlags.Static);
var instance = property.GetValue(null);
答案 2 :(得分:0)
您不需要使用构造函数,只需访问该属性即可。
var value = typeof (Test).GetProperty("Instance").GetValue(null, null);