是否无法动态使用泛型?

时间:2008-10-24 15:22:53

标签: c# generics

我需要在运行时创建使用泛型的类的实例,比如class<T>,而不知道它们将具有的类型T,我想做类似的事情:

public Dictionary<Type, object> GenerateLists(List<Type> types)
{
    Dictionary<Type, object> lists = new Dictionary<Type, object>();

    foreach (Type type in types)
    {
        lists.Add(type, new List<type>()); /* this new List<type>() doesn't work */
    }

    return lists;
}

......但我不能。我认为不可能在通用括号内的C#中写入一个类型变量。还有其他办法吗?

2 个答案:

答案 0 :(得分:17)

你不能这样做 - 泛型的主要是编译时类型安全 - 但你可以用反射来做:

public Dictionary<Type, object> GenerateLists(List<Type> types)
{
    Dictionary<Type, object> lists = new Dictionary<Type, object>();

    foreach (Type type in types)
    {
        Type genericList = typeof(List<>).MakeGenericType(type);
        lists.Add(type, Activator.CreateInstance(genericList));
    }

    return lists;
}

答案 1 :(得分:4)

根据您调用此方法的频率,使用Activator.CreateInstance可能会很慢。另一种选择是做这样的事情:

私人词典&gt; delegates = new Dictionary&gt;();

    public Dictionary<Type, object> GenerateLists(List<Type> types)
    {
        Dictionary<Type, object> lists = new Dictionary<Type, object>();

        foreach (Type type in types)
        {
            if (!delegates.ContainsKey(type))
                delegates.Add(type, CreateListDelegate(type));
            lists.Add(type, delegates[type]());
        }

        return lists;
    }

    private Func<object> CreateListDelegate(Type type)
    {
        MethodInfo createListMethod = GetType().GetMethod("CreateList");
        MethodInfo genericCreateListMethod = createListMethod.MakeGenericMethod(type);
        return Delegate.CreateDelegate(typeof(Func<object>), this, genericCreateListMethod) as Func<object>;
    }

    public object CreateList<T>()
    {
        return new List<T>();
    }

在第一次点击时,它将创建一个创建列表的泛型方法的委托,然后将其放入字典中。在每次后续点击中,您只需为该类型调用该委托。

希望这有帮助!