C# 基于stringvalue创建实例
我希望使用字符串值创建一个类的实例。 根据我在这里读到的:它应该有效C# 基于stringvalue创建实例,c#,reflection,C#,Reflection,我希望使用字符串值创建一个类的实例。 根据我在这里读到的:它应该有效 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.A
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");
为什么这样不行?
我得到以下错误:
{“无法从程序集'theassemblyname'加载类型'Foo',
Version=1.0.0.0,Culture=neutral,PublicKeyToken=null.“:“Foo”}
您应该使用完整的限定类型名,包括整个命名空间,而不是简单的类型名 像这样:
var foo = Activator.CreateInstance(assName, "Bar.Baz.Foo");
正如上面所说:
首选类型的完全限定名
使用完全限定名称(如已建议的):
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));
你可以接受@Patrick Hofman的解决方案,并投我的一票:)注意,如果你有多个名称相同但在另一个命名空间中的类型,那么第二个示例是危险的。第三个示例可以简化为
new Foo()
,因为你已经知道了类型。