是否可以根据表示其类型的字符串值创建对象实例?
问题描述:
我想在我的XML文档中基于一个字符串在LINQ-to-XML查询中动态创建某种类型的对象。我已经习惯了能够动态地创建任何类型的PHP和JavaScript的目的是通过简单地能够写类似:是否可以根据表示其类型的字符串值创建对象实例?
$obj = new $typeName();
理想情况下,我希望能够做这样的事情:
List<someObj> = (from someObjs in XMLfile
select new someObj()
{
Name = (string)someObjs.Element("name"),
NestedObj = new someObjs.Element("nestedObj").Element("type")()
{
NestedName = (string)someObjs.Element("nestedObj").Element("name")
}
}).ToList();
我只是不知道如何做到这一点,而不抓住当前正在执行的程序集。
答
您可以使用:
Activator.CreateInstance(Type.GetType(typeName))
当然,对于这类型的作品只有一个参数的构造函数。
更新(初始化的对象):
可以使用C#4动态类型特征来设置新创建的对象的属性:
dynamic newObj = Activator.CreateInstance(Type.GetType(typeName));
newObj.NestedName = str;
在LINQ到XML上下文查询,你可能不得不求助于lambda语法与明确的身体:
var list = XMLFile.Select(someObjs => {
dynamic nestedObj = Activator.CreateInstance(
Type.GetType(someObjs.Element("nestedObj").Element("type")));
nestedObj.NestedName = (string)someObjs.Element("nestedObj").Element("name");
return new someObj {
Name = (string)someObjs.Element("name"),
NestedObj = nestedObj
};
}).ToList();
需要注意的事项:如果类型不在mscorlib或ExecutingAssembly中,Afaik'typeName'也必须声明程序集名称。 – dtb 2010-08-21 17:39:43
您可以调用'Type.GetType(string)',然后使用该类型与另一个Activator.CreateInstance重载。 – 2010-08-21 17:59:40
@Jim:将您的建议添加到答案中。 – 2010-08-21 18:04:28