2012-08-02 55 views
1

將對象轉換回通用列表的正確代碼是什麼樣的?通過只有可用類型將對象轉換爲泛型IEnumerable

Type x = typeof(MyClass); 
object o = new List<MyClass>(); 

List<x> l = o as List<x>; // Not working 

編輯: 也許不是都清楚:對象是一個通用型,我不知道在編譯時的名單..不過列表具有類似功能的「添加」我反正可以調用,如:

l.Add((new MyClass() as object)) as x); 
+0

在最後一行中使用'List '而不是列表是否有原因?是否需要將列表轉換爲給定Type對象的通用列表? – 2012-08-02 13:40:12

+1

總之,你不能使用這種語法。也許你可以解釋爲什麼你需要這個,有人可以提出一個更好的選擇? – 2012-08-02 13:40:16

回答

2
List<MyClass> l = (List<MyClass>)o; 

List<MyClass> l = o as List<MyClass>; 

你的意思

List<> l = o as List<>; 

,直到你使用一個通用類這是不可能的:

class C<T> 
{ 
    public List<T> List = new List<T>(); 
} 

用法:

C<MyClass> c = new C<MyClass>(); 
c.List.Add(new MyClass()); 

最後我得到了OP的目標:

Type listType = typeof(List<>); 
Type targetType = listType.MakeGenericType(typeof(YourClass)); 
List<YourClass> list = (List<YourClass>)Activator.CreateInstance(targetType); 

詳情請參閱MSDN

+0

對不起,也許這個問題是誤導..我會編輯它 – David 2012-08-02 13:40:08

+0

Thx。但是我怎樣才能使用「var c = new C ();」? – David 2012-08-02 13:48:13

+0

@David:查看我更新的答案。 – abatishchev 2012-08-02 13:54:37

0
object testobject = new List<string>(); 
List<string> list = (List<string>)testobject; 
+0

這是不正確的問題澄清通過運算 – abatishchev 2012-08-02 15:09:03

+0

你downvote的答案,因爲海報改變了我發佈我的答案後的問題...? – Jan 2012-08-02 15:15:51

0
 List<Employee> employees = new List<Employee> { new Employee { Id = Guid.NewGuid().ToString(), Name = "SOME" }, new Employee { Id = Guid.NewGuid().ToString(), Name = "SOME2" } }; 

     object obj = employees; 

     List<Employee> unBoxed = (List<Employee>)obj; 
+0

這是不正確的問題澄清由操作 – abatishchev 2012-08-02 15:09:33

1

當通用接口是不可用的,因爲你不知道在編譯時的類型參數,但非通用接口可用,您可以使用來代替:

Type x = typeof(MyClass); 
object o = new List<MyClass>(); 

IList l = (IList)o; 
l.Add(new MyClass()); 

非通用IList接口由通用List<T>類實現。

相關問題