Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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# 从字符串值创建对象_C#_Reflection - Fatal编程技术网

C# 从字符串值创建对象

C# 从字符串值创建对象,c#,reflection,C#,Reflection,我想从字符串值开始获取对象的属性和方法 我有一个表示类名称的字符串值 我是这样做的 string p = "Employee"; Type emp = Type.GetType(p); object empObj = Activator.CreateInstance(emp); 但对象为空,因为emp也为空。。。出现问题添加命名空间 string p = "Employee"; string namespace = "MyNamespace" object empObj = Activator

我想从字符串值开始获取对象的属性和方法

我有一个表示类名称的字符串值

我是这样做的

string p = "Employee";
Type emp = Type.GetType(p);
object empObj = Activator.CreateInstance(emp);
但对象为空,因为emp也为空。。。出现问题

添加命名空间

string p = "Employee";
string namespace = "MyNamespace"
object empObj = Activator.CreateInstance(namespace, p);

添加名称空间

string p = "Employee";
string namespace = "MyNamespace"
object empObj = Activator.CreateInstance(namespace, p);


使用反射时必须使用完整的程序集名称或命名空间

你的例子是:

string p = "MyNamespace.Employee";
另一个例子是,对于
System.Windows.Forms
类,您将使用:

string p = "System.Windows.Forms.Form, " + 
"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, " + 
"PublicKeyToken=b77a5c561934e089");

多看,

如果您不知道自己的全名,可以使用获取全名

Console.WriteLine(typeof(Employee).AssemblyQualifiedName);

使用反射时必须使用完整的程序集名称或命名空间

你的例子是:

string p = "MyNamespace.Employee";
另一个例子是,对于
System.Windows.Forms
类,您将使用:

string p = "System.Windows.Forms.Form, " + 
"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, " + 
"PublicKeyToken=b77a5c561934e089");

多看,

如果您不知道自己的全名,可以使用获取全名

Console.WriteLine(typeof(Employee).AssemblyQualifiedName);
GetType(string)要求字符串参数为。为了找到要创建的对象类型的构造函数,Activator类需要知道名称空间、包含它的程序集及其版本,以及对象类型本身的名称

例如:

string p = "MyNameSpace.Employee, MyAssembly, Version=1.4.1.0, Culture=neutral, PublicKeyToken=e7d6180f3b29ae11"
Type emp = Type.GetType(p);
object empObj = Activator.CreateInstance(emp);
如果必须像这样处理的类型范围很小,并且在编译时已知,那么最好使用一个简单的switch语句。或者,如果类型可能包含在其他程序集中,例如插件DLL中,请查看MEF并使用元数据装饰类,您可以从Factory对象访问这些元数据来构造正确类型的实例。

type。GetType(string)要求string参数为。为了找到要创建的对象类型的构造函数,Activator类需要知道名称空间、包含它的程序集及其版本,以及对象类型本身的名称

例如:

string p = "MyNameSpace.Employee, MyAssembly, Version=1.4.1.0, Culture=neutral, PublicKeyToken=e7d6180f3b29ae11"
Type emp = Type.GetType(p);
object empObj = Activator.CreateInstance(emp);

如果必须像这样处理的类型范围很小,并且在编译时已知,那么最好使用一个简单的switch语句。或者,如果类型可能包含在其他程序集中,例如插件DLL中,请查看MEF并使用元数据装饰类,您可以从Factory对象访问这些元数据来构造正确类型的实例。

您的代码是错误的。必须为类型使用程序集限定名。类似于“System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”。因此,不仅仅是名称空间+类型名,还包括存储它的程序集。必需,以便CLR能够确定需要加载哪个程序集才能找到类型。您的代码错误。必须为类型使用程序集限定名。类似于“System.String,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”。因此,不仅仅是名称空间+类型名,还包括存储它的程序集。必需,以便CLR能够确定需要加载哪个程序集才能找到类型。