2015-05-12 45 views
0

我有一個動態對象列表。在運行時,我想找到列表中的對象的類型,以便我可以實例化一個新類型的列表。查找c中動態對象的類型#

List<dynamic> list1= new List<dynamic>() { new Test() {ID = 1} } 

我想知道ID是int類型,所以我可以在Activator.CreateInstance語句中使用它。當我嘗試使用以下語句獲得該類型時,我始終得到「對象」

Type typeInArgument = list1.GetType().GenericTypeArguments[0]; 

有沒有辦法獲取此類型?我看到一些類似的問題,其中建議使用

Type unknown = ((ObjectHandle)list1).Unwrap().GetType(); 

但是,這不能編譯列表。

我需要建議來解決這個問題。

回答

3

聽起來好像它的工作原理和它可能的一樣。

因爲您使用的是dynamic,所以列表元素的最大公分母是object。僅僅因爲你碰巧只有一個元素,這並不意味着運行時可以保證這一點。

因此,您可能需要特殊處理您要查找的內容。

Type ret; 
if (list1.Count == 0) 
    ret = typeof(object); 
else 
    ret = list1[0].GetType(); 

當然,如果您給我們的代碼是從字面上理解的,那麼檢查是多餘的。但我希望你明白這一點。

您還可以添加一個檢查來遍歷列表,並查找是否所有項目都是相同的類型,如果這是一個要求。

一般來說,聽起來這可能不是使用dynamic的好時機。如果你需要匿名類型,我建議你轉到具體的類型。如果你在這裏做你正在做的事情,只需輸入它作爲List<Test>

當然,如果你要找的東西基本上是這個清單的一個副本,那麼你可以這樣做,並且它是正確的。爲了便於閱讀,我將其作爲foreach來完成,但LINQ在這裏將是一個不錯的選擇。

List<object> ret = new List<object>(); 
foreach (var v in list1) 
{ 
    var type = v.GetType(); 

    ret.Add(/* new instance of type */); 
} 
return ret; 

記住,當然,這並不能保證你任何有關的各類載,你就會有很好的同樣的問題時,會再次嘗試與實際讀取結果的列表。

我真的會建議重新評估你對動態的使用。它確實允許一些不可能的東西,所以你可以選擇堅持下去,但是值得再思考一下。

2

A List<dynamic>不是特定的內部類型。 dynamic整點就是它可以是任何東西。

取而代之,您可以獲取列表中的項目類型:list1[0].GetType()
請注意,不能保證下一個項目的類型相同。