2016-12-30 111 views
4

我希望使用字符串值创建类的实例。 根据我在这里读到的:Activator.CreateInstance Method (String, String)它应该工作!基于字符串值创建实例

public class Foo 
{ 
    public string prop01 { get; set; } 
    public int prop02 { get; set; } 
} 

//var assName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; 
var assName = System.Reflection.Assembly.GetExecutingAssembly().GetName().FullName; 
var foo = Activator.CreateInstance(assName, "Foo"); 

为什么不能正常工作? 我得到以下错误:

{"Could not load type 'Foo' from assembly 'theassemblyname, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.":"Foo"}

回答

4

取而代之的是简单类型的名字,你应该使用完全限定的类型名称,包括整个命名空间。

像这样:

var foo = Activator.CreateInstance(assName, "Bar.Baz.Foo"); 

由于MSDN说:

The fully qualified name of the preferred type.

3

要么使用完全合格的名称,前面已经提出:

var foo = Activator.CreateInstance(assName, "FooNamespace.Foo"); 

,或因名称类型:

var type = System.Reflection.Assembly.GetExecutingAssembly().GetTypes() 
             .First(x=>x.Name=="Foo"); 
var foo = Activator.CreateInstance(type); 

更简单的是直接用你的Foo类:

var foo = Activator.CreateInstance(typeof(Foo)); 
+0

你能接受@Patrick福满的解决方案,并给予一个给予好评矿山:) –

+0

注意,第二个样品是危险的,如果你有多个类型的相同的名称,但在另一个名称空间内。 –

+0

第三个示例可以简化为'new Foo()',因为您已经知道该类型。 –