2010-08-21 42 views
3

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

我只是不知道如何做到這一點,而不抓住當前正在執行的程序集。

回答

9

您可以使用:

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

相關問題