我正在寻找一种解决方案来创建类的单例实例,只有类的名称可用。
我查看了Activator.CreateInstance()
,但这需要重新调整原始对象才能进行方法调用。然后我进去看看MEF
可能会有什么帮助,这似乎是我想去的路线,但我不确定这对于我想要实现的目标是否过度。
简而言之,我引用了具有不同名称的Web服务(ASMX)。当用户输入应用程序的URL时,这些名称将暴露给WinForms应用程序中的组合框。从那里,需要调用每个服务公开的几个方法,但是,类将是抽象类中的虚方法。
这听起来很像插件框架,但这里的想法是根据安装的基础类型动态调用Office SharePoint Server(2007/2010)中的Microsoft特定Web服务。
希望我已经给了足够的背景。
答案 0 :(得分:1)
您使用的是C#4和.NET 4吗?如果是这样,你可以使用:
Type type = Type.GetType(typeName);
dynamic service = Activator.CreateInstance(type);
service.FirstCommonMethod("foo", "bar");
service.SecondCommonMethod();
请注意,typeName
必须在至少处于命名空间限定状态,如果类型位于mscorlib
以外的程序集或调用程序集中,则它也应该是程序集-qualified。
答案 1 :(得分:0)
以下代码比使用Activator.CreateInstance
略快,但只是勉强。我大多只是通过Type
来说明另一种实例化对象的方法。
var type = Type.GetType(yourClassNamePossiblyWithLeadingNamespaces);
var expressionNew = Expression.New(type);
var typeFactory = Expression.Lambda<Func<dynamic>>(expressionNew).Compile();
var instanceOfClass = typeFactory();
编辑:与Jon的回答相同:这需要.NET 4和C#4才能使用dynamic
。