使用函数传递的自定义类型创建字典C#

时间:2012-09-21 08:22:23

标签: c# dictionary

我想用TKey作为字符串创建一个Dictionary,而TValue是来自编译时不知道的类型。

比方说,我有一个函数

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

 }

这种情况是否可行,或者我遗漏了一些非常基本的东西?

5 个答案:

答案 0 :(得分:4)

如果您将type作为参数传递,则可以执行此操作:

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

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

答案 1 :(得分:3)

使方法通用:

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

}

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

您可以将其称为:

CreateDict<MyCustomType>();

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

答案 2 :(得分:3)

你可以做一些反思:

Type dict = typeof (Dictionary<,>);
Type[] parameters = {typeof (string), type};
Type parametrizedDict = dict.MakeGenericType(parameters);
object result = Activator.CreateInstance(parametrizedDict);

答案 3 :(得分:1)

所有实例和类都是对象,所以为什么不Dictionary<string,object>并且你的转换方式与MVC,Session或Cache中的ViewData相同,所有这些都需要转换。

答案 4 :(得分: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公开您希望保留在字典中的类型的常见特征。

作为最后的手段,我希望能够反思。