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

标签 c# linq-to-xml

我正在尝试根据 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 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();

关于c# - 是否可以根据表示其类型的字符串值创建对象实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3538304/

相关文章:

c# - WCF Web服务:响应为200/ok,但响应正文为空

c# - 在 Linq to XML 中检查节点是否存在

c# - 使用 C# Linq to XML 解析 GML 数据

c# - 明确地初始化构造函数中私有(private)字段的默认值..WTF?

c# - 国际奥委会设计资源

c# - 在C#中获取文件的文件大小

c# - 二叉搜索树的递归函数实现

c# - 移除空的 XML 标签

c# - 如何使用 LINQ 获取 XML 元素的位置(按顺序索引)?

c# - X文档文件名