如何在类型变量中创建任何类型的字典? [复制]
Posted
技术标签:
【中文标题】如何在类型变量中创建任何类型的字典? [复制]【英文标题】:How to create a Dictionary with any types in Type variables? [duplicate] 【发布时间】:2012-07-27 20:54:14 【问题描述】:目前我面临的问题是我需要创建一个包含任何类型案例的 Dictionary 实例。类型由方法的参数传递。 我不只是想创建一个动态或对象类型的字典,因为这会通过使用我的库为用户带来很多转换问题。 我也不能使用简单的构造函数,因为我的方法用真实的数据(存储在文件中)填充 Dictionary。按类型变量创建特定字典很重要。 这就是我的想法:
public static Dictionary<dynamic, dynamic> createDict(Type type1, Type type2)
// how to create the dictionary?
// im filling my dictionary with any data ...
return dict;
这里用户调用我的方法:
Dictionary<string, int> dict = MyLib.createDict(typeof(string), typeof(int));
// or
MyOwnType myInstance = new MyOwnType();
Dictionary<string, MyOwnType> dict = MyLib.createDict(typeof(string), myInstance.GetType());
【问题讨论】:
您的具体问题是什么?为什么不对函数调用使用泛型参数? 【参考方案1】:Type dictType = typeof(Dictionary<, >).MakeGenericType(Type1, Type2);
var dict = Activator.CreateInstance(dictType);
获取Dictionary
的类型
使用MakeGenericType
创建具有指定类型的泛型类型
使用Activator.CreateInstance
创建泛型类型的实例
【讨论】:
哦,太简单了,我先用目标类型尝试了这个,但 var 似乎终于可以工作了。但是,我意识到它是动态的,以便能够调用我的 Dictionary 方法来填充我的字典。谢谢。 您如何将Add
项添加到新创建的字典中? dict.Add("keyName", "value")
不会编译,因为 dict
被认为只是一般的 object
。【参考方案2】:
使用泛型,您可以执行以下操作:
public static Dictionary<T, U> CreateDict<T,U>()
Dictionary<T,U> dict = new Dictionary<T,U>();
// Fill dictionary with data
return dict;
然后用户可以调用这个函数:
var myDict1 = CreateDict<string,int>();
var myDict2 = CreateDict<string,MyOwnType>();
【讨论】:
是的,问题只是,它可以是任何类型,甚至是用户自己的类型的实例。在这种情况下,我很困惑如何动态创建字典。 用户将提供类型。在您给出的示例中,用户将字符串和 int 作为参数传递。这些是否是自定义类型都没有关系。我将用一个例子编辑我的答案 我用一个例子更新了我的第一篇文章,谢谢。 感谢您的努力,但是,在我的图书馆中,由于几个原因,我无法使用它。不过我从中学到了很多,非常感谢。 我当前(刚刚完成)的项目是一个序列化程序,它甚至可以与字典一起使用。问题出现在我的 deserializeDict 方法上。用户使用 XML 文件路径和字典类型调用该方法,我通过 GetGenericArguments() 获取子类型。所以我在创建字典之前得到了类型变量中的类型。对于用户来说,它更容易传输字典的类型,而不是像你的方式那样传输两个子类型。但是,谢谢。以上是关于如何在类型变量中创建任何类型的字典? [复制]的主要内容,如果未能解决你的问题,请参考以下文章