Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于stringvalue创建实例_C#_Reflection - Fatal编程技术网

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()
,因为你已经知道了类型。