是否可以根据表示其类型的字符串值创建对象实例?

问题描述:

我想在我的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(); 
+0

需要注意的事项:如果类型不在mscorlib或ExecutingAssembly中,Afaik'typeName'也必须声明程序集名称。 – dtb 2010-08-21 17:39:43

+1

您可以调用'Type.GetType(string)',然后使用该类型与另一个Activator.CreateInstance重载。 – 2010-08-21 17:59:40

+0

@Jim:将您的建议添加到答案中。 – 2010-08-21 18:04:28

使用createin立场方法activator class