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

C# 当我只有类的名称时,如何创建实例?,c#,reflection,C#,Reflection,我正在寻找一种解决方案来创建类的单例实例,此时只有类的名称可用 我已经研究了Activator.CreateInstance(),但这需要对原始对象进行重铸,才能进行方法调用。然后我进去看看MEF可能会有什么帮助,这似乎是我想要走的路线,但我不确定这是否是我想要实现的目标的过度手段 简而言之,我对web服务(ASMX)有不同名称的引用。当用户输入应用程序的URL时,这些名称将显示在WinForms应用程序的组合框中。从这里开始,需要调用由每个服务公开的两个方法,但是,这些类将是抽象类中的虚拟方法

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

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

简而言之,我对web服务(ASMX)有不同名称的引用。当用户输入应用程序的URL时,这些名称将显示在WinForms应用程序的组合框中。从这里开始,需要调用由每个服务公开的两个方法,但是,这些类将是抽象类中的虚拟方法

这听起来很像一个插件框架,但是这里的想法是基于安装的基础类型动态地在Office SharePoint Server(2007/2010)中调用特定于微软的Web服务。 希望我提供了足够的上下文。

您使用的是C#4和.NET 4吗?如果是这样,您可以使用:

Type type = Type.GetType(typeName);
dynamic service = Activator.CreateInstance(type);
service.FirstCommonMethod("foo", "bar");
service.SecondCommonMethod();

请注意,
typeName
至少必须是命名空间限定的,并且如果类型位于除
mscorlib
或调用程序集中以外的程序集中,则它也应该是程序集限定的。

以下代码比使用
Activator.CreateInstance
稍微快一点,尽管速度很小。我主要是演示另一种通过
类型
实例化对象的方法

var type = Type.GetType(yourClassNamePossiblyWithLeadingNamespaces);
var expressionNew = Expression.New(type);
var typeFactory = Expression.Lambda<Func<dynamic>>(expressionNew).Compile();
var instanceOfClass = typeFactory();
var type=type.GetType(您的classnamePossiblyWithLeadingNamespaces);
var expressionNew=Expression.New(类型);
var typeFactory=Expression.Lambda(expressionNew.Compile();
var instanceOfClass=typeFactory();

编辑:与Jon的答案相同:这需要.NET 4和C#4使用
动态

此答案假设用户拥有类的
类型
对象。在这个问题中,他们说他们只有类的名称,大概是一个字符串将说明完整的解决方案。