Можно ли создать экземпляр объекта на основе строкового значения, обозначающего его тип? - PullRequest
3 голосов
/ 21 августа 2010

Я пытаюсь динамически создать объект определенного типа в запросе LINQ-to-XML на основе строки в моем 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();

Я просто не могу понять, как это сделать, не схватившись за текущую исполняющуюся сборку.

Ответы [ 2 ]

9 голосов
/ 21 августа 2010

Вы можете использовать:

Activator.CreateInstance(Type.GetType(typeName))

Конечно, это работает только для типов с конструктором без параметров.


Обновление (инициализация объекта):

Вы можете использовать функции динамической типизации C # 4 для установки свойств вновь созданного объекта:

dynamic newObj = Activator.CreateInstance(Type.GetType(typeName));
newObj.NestedName = str;

В контексте запроса LINQ to XML вам, возможно, придется прибегнуть к лямбда-синтаксису с явным телом:

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();
3 голосов
/ 21 августа 2010

Используйте метод createinstance класс активатора

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...