可以通过Type实例动态设置泛型类的类型参数吗?

时间:2010-11-17 04:51:44

标签: c# .net generics

我想做类似下面代码的事情。

    public IList SomeMethod(Type t)
    { 
        List<t> list = new List<t>;
        return list;
    }

当然,这不起作用。是否有其他方法可以使用对Type实例的引用动态设置泛型类的类型参数?

4 个答案:

答案 0 :(得分:7)

试试这个:

public IList SomeMethod(Type t)
{ 
    Type listType = typeof(List<>);
    listType = listType.MakeGenericType(new Type[] { t});
    return (IList)Activator.CreateInstance(listType);
}

答案 1 :(得分:4)

您必须使用Type.MakeGenericType()方法和Activator.CreateInstance()

生成的代码很丑陋,速度很慢,并且会让您在编译时通常希望捕获的内容出现运行时故障。这些都不是什么大不了的事,但我已经看到最后一个特别关注其他.Net开发人员(他们期望完全类型安全)措手不及。

就个人而言,我从未这样做过。每当我受到诱惑时,我都把它作为我的设计出现问题并回到绘图板的迹象。我没有后悔当然。

答案 2 :(得分:1)

此处没有其他信息,仅适用于那些遵循沙盒代码的内容(我必须全部尝试)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ListFromType
{
    class Program
    {
        static void Main(string[] args)
        {
            var test1 = FlatList(typeof(DateTime));
            var test2 = TypedList<DateTime>(typeof(DateTime));
        }

        public static IList<T> TypedList<T>(Type type)
        {
            return FlatList(type).Cast<T>().ToList();
        }

        public static IList FlatList(Type type)
        {
            var listType = typeof(List<>).MakeGenericType(new Type[] { type });
            var list = Activator.CreateInstance(listType);
            return (IList) list;
        } 
    }
}

答案 3 :(得分:-1)

你可以尝试做以下,它是通用类型,

    public IList SomeMethod<T>(T t)
    {
        List<T> list = new List<T>();
        list.Add(t);
        return list;
    }