如何在类型变量中创建任何类型的字典? [复制]

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() 获取子类型。所以我在创建字典之前得到了类型变量中的类型。对于用户来说,它更容易传输字典的类型,而不是像你的方式那样传输两个子类型。但是,谢谢。

以上是关于如何在类型变量中创建任何类型的字典? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中创建列表列表并添加任何类型的列表? [复制]

如何在 C# 中创建包含不同类型的字典

如何在 Xcode 7.2 中创建类别? [复制]

如何在 Java 中创建一些变量类型别名

如何在 Java 中创建字典? [关闭]

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表