我正在尝试根据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();
如果不抓住当前正在执行的程序集,我就无法弄清楚如何做到这一点。
答案 0 :(得分:9)
您可以使用:
Activator.CreateInstance(Type.GetType(typeName))
当然,这仅适用于具有无参数构造函数的类型。
更新(初始化对象):
您可以使用C#4动态类型功能来设置新创建的对象的属性:
dynamic newObj = Activator.CreateInstance(Type.GetType(typeName));
newObj.NestedName = str;
在LINQ to 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();
答案 1 :(得分:3)