当我只有类的名称时,如何创建实例?

时间:2011-10-07 12:49:38

标签: c# reflection

我正在寻找一种解决方案来创建类的单例实例,只有类的名称可用。

我查看了Activator.CreateInstance(),但这需要重新调整原始对象才能进行方法调用。然后我进去看看MEF可能会有什么帮助,这似乎是我想去的路线,但我不确定这对于我想要实现的目标是否过度。

简而言之,我引用了具有不同名称的Web服务(ASMX)。当用户输入应用程序的URL时,这些名称将暴露给WinForms应用程序中的组合框。从那里,需要调用每个服务公开的几个方法,但是,类将是抽象类中的虚方法。

这听起来很像插件框架,但这里的想法是根据安装的基础类型动态调用Office SharePoint Server(2007/2010)中的Microsoft特定Web服务。

希望我已经给了足够的背景。

2 个答案:

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