仅使用可用类型将对象转换为通用IEnumerable

时间:2012-08-02 13:34:22

标签: c# .net generics casting

将对象强制转换回通用列表的正确代码是什么?

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

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

编辑: 也许并不是全部清楚:该对象是一个通用类型的列表,我在编译时不知道..然而List有像“Add”这样的函数,我可以调用,如:

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

当通用接口不可用时,因为您在编译时不知道类型参数,但是非通用接口可用,您可以使用它:

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

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

非通用IList接口由通用List<T>类实现。

答案 2 :(得分:0)

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

答案 3 :(得分: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;