我想获得一个对象的属性和方法,从字符串值开始。
我有一个表示类名的字符串值。
我这样做
string p = "Employee";
Type emp = Type.GetType(p);
object empObj = Activator.CreateInstance(emp);
但是对象是空的,因为空中的emp也是空的…不对劲
使用反射时必须使用完整的程序集名称或名称空间。
你的例子:
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");
查看更多,如何从字符串中获得类引用?
如果您不知道您的全名,您可以使用AssemblyQualifiedName
属性获得它。
Console.WriteLine(typeof(Employee).AssemblyQualifiedName);
Type.GetType(string)要求字符串参数是一个AssemblyQualifiedName。为了定位您想要创建的对象类型的构造函数,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对象访问的元数据来修饰类,以构造正确类型的实例。
添加命名空间
string p = "Employee";
string namespace = "MyNamespace"
object empObj = Activator.CreateInstance(namespace, p);
或
string p = "Employee";
string namespace = "MyNamespace"
Type emp = Type.GetType(namespace + "." + p);
object empObj = Activator.CreateInstance(emp);