2012-08-02 53 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>类实现。

相关问题