我有一个实现Singleton设计模式的类。但是,每当我尝试获取该类的实例时,使用Activator.CreateInstance(MySingletonType)仅调用私有构造函数。有没有办法调用除私有构造函数之外的其他方法?
我的课程定义如下:
public class MySingletonClass{
private static volatile MySingletonClassinstance;
private static object syncRoot = new object();
private MySingletonClass()
{
//activator.createInstance() comes here each intantiation.
}
public static MySingletonClassInstance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new MySingletonClass();
}
}
return instance;
}
}
}
实例化如下:
Type assemblyType = Type.GetType(realType + ", " + assemblyName);
IService service = Activator.CreateInstance(assemblyType, true) as IService;
答案 0 :(得分:3)
Activator.CreateInstance
,除了一个极端边缘情况外,总是会创建一个新实例。我建议你可能不想在这里使用Activator
。
然而,如果你别无选择,hacky hack hack hack就是创建一个继承自ContextBoundObject
的类,并使用ProxyAttribute
的自定义子类来装饰它。在自定义ProxyAttribute
子类中,覆盖CreateInstance
以执行您想要的任何操作。这是各种邪恶。但它甚至适用于new Foo()
。
答案 1 :(得分:0)
Hei我不知道你为什么要用反射创建一个单例类的对象。
单例类的基本目的是它只有一个对象并具有全局访问权。
但是你可以在单例类中访问任何方法,如:
public class MySingletonClass {
private static volatile MySingletonClass instance;
private static object syncRoot = new object();
private MySingletonClass() { }
public static MySingletonClass MySingletonClassInstance {
get {
if (instance == null) {
lock (syncRoot) {
if (instance == null)
instance = new MySingletonClass();
}
}
return instance;
}
}
public void CallMySingleTonClassMethod() { }
}
public class program {
static void Main() {
//calling a
methodMySingletonClass.MySingletonClassInstance
.CallMySingleTonClassMethod();
}
}