我有一个要求,即对象类型[对象的名称]作为字符串变量传递。现在基于传递的对象名称,我需要创建该对象类型。请注意,字符串值包含确切的对象类型名称。我编写了一个代码片段,但它抛出异常。
例如 -
string objectName = "EntityTest.Entity.OrderEntity";//Entity type name
object obj = new object();
object newobj = new object();
newobj = Convert.ChangeType(obj, Type.GetType(objectName));
我这样做我得到错误 - > Object must implement IConvertible.
我的实体OrderEntity
已经实现了IConvertible
界面。
非常感谢任何帮助/建议。有没有其他方法可以创建对象来满足我的要求。
答案 0 :(得分:9)
您目前正在尝试转换现有对象,而不是创建一个正确的类型。假设您的Type.GetType
来电正常,您可以使用:
Type type = Type.GetType(objectName);
object x = Activator.CreateInstance(type);
需要注意几点:
Type.GetType(string)
需要一个程序集限定名称,除非该类型位于当前正在执行的程序集中,或mscorlib
Activator.CreateInstance(Type)
将调用无参数构造函数(必须可访问);如果需要将参数传递给构造函数,则可以使用other overloads。答案 1 :(得分:3)
您的问题是您正在创建object
的实例,然后尝试将其转换为更具体的类型(它不可能)。
您需要一种方法来调用您尝试创建的类型的默认构造函数。看看Activator.CreateInstance()
:
var type = Type.GetType(typeName);
var instance = Activator.CreateInstance(type);
如果类型没有默认构造函数,则上面的示例将失败。在这种情况下,你最好的选择可能是use this overload(它将一组对象用作构造函数参数,然后尝试找到最佳匹配)