【问题标题】: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());

【问题讨论】:

  • 您的具体问题是什么?为什么不对函数调用使用泛型参数?

标签: c# .net dynamic types dictionary


【解决方案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() 获取子类型。所以我在创建字典之前得到了类型变量中的类型。对于用户来说,它更容易传输字典的类型,而不是像你的方式那样传输两个子类型。但是,谢谢。
猜你喜欢
  • 2020-12-06
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-17
  • 2011-06-23
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多