0

我想创建一个字典,其中 TKey 作为字符串,TValue 来自编译时不知道的类型。

比如说我有一个函数

 createDict(Type type)
 {
     Dictionary<string, {here's the type from the func. argument}> dict = new Dictionary..

 }

这种情况是否可能,或者我错过了一些非常基本的东西?

4

5 回答 5

4

如果您将类型作为参数传递,则可以完成:

var dictionaryType = typeof(Dictionary<,>).MakeGenericType(typeof(string),type);
var dictionary = (IDictionary)Activator.CreateInstance(dictionaryType);

由于您对插入该词典的内容的正确性负全部责任,因此使用此类词典将更加困难。

于 2012-09-21T08:29:18.483 回答
3

使方法通用:

public void CreateDict<T>()
{
    Dictionary<string,T> dict = new Dictionary<string,T>();

}

尽管您可能希望返回类型也是Dictionary<string,T>,并将约束添加到泛型类型参数。

你可以这样称呼它:

CreateDict<MyCustomType>();

以上假设可以在编译期间传入类型。

于 2012-09-21T08:27:20.223 回答
3

你可以做一些反思:

Type dict = typeof (Dictionary<,>);
Type[] parameters = {typeof (string), type};
Type parametrizedDict = dict.MakeGenericType(parameters);
object result = Activator.CreateInstance(parametrizedDict);
于 2012-09-21T08:27:36.497 回答
1

所有实例和类都是对象,所以为什么不进行Dictionary<string,object>转换,并且您确实像在 MVC、Session 或 Cache 中使用 ViewData 一样进行转换,所有这些都需要转换。

于 2012-09-21T08:29:13.500 回答
1

如果类型在编译时已知,则使用泛型:

void Main()
{
    var dict = CreateDict<int>();
    dict["key"] = 10;
}

Dictionary<string, T> CreateDict<T>()
{
    return new Dictionary<string, T>();
}

如果没有,请重构以使用基本类型或接口,例如:

var dic = new Dictionary<string, IMyType>();

其中 IMyType 公开了您希望保留在字典中的类型的共同特征。

只有作为最后的手段,我才会考虑反思。

于 2012-09-21T08:29:33.053 回答