如何根据类中属性的类型动态创建C#泛型字典?

时间:2012-01-18 09:39:26

标签: c# .net generics dictionary

我正在尝试根据以下类中的属性类型动态创建通用词典:

public class StatsModel
{
    public Dictionary<string, int> Stats { get; set; }
}

假设Stats属性的System.Type被赋值给变量'propertyType',并且如果类型是泛型字典,则IsGenericDictionary方法返回true。然后我使用Activator.CreateInstance动态创建相同类型的通用Dictionary实例:

// Note: property is a System.Reflection.PropertyInfo
Type propertyType = property.PropertyType;
if (IsGenericDictionary(propertyType))
{
    object dictionary = Activator.CreateInstance(propertyType);
}

因为我已经知道创建的对象是一个泛型字典,我想要转换为一个泛型字典,其类型参数等于属性类型的泛型参数:

Type[] genericArguments = propertyType.GetGenericArguments();
// genericArguments contains two Types: System.String and System.Int32
Dictionary<?, ?> = (Dictionary<?, ?>)Activator.CreateInstance(propertyType);

这可能吗?

1 个答案:

答案 0 :(得分:6)

如果你想这样做,你将不得不使用反射或dynamic翻转成泛型方法,并使用泛型类型参数。没有它,你必须使用object。就个人而言,我只是在这里使用非通用的IDictionary API:

// we know it is a dictionary of some kind
var data = (IDictionary)Activator.CreateInstance(propertyType);

使您可以访问数据,以及您希望在字典上使用的所有常用方法(但是:使用object)。翻阅一般方法是一种痛苦;要在4.0之前执行此操作需要反思 - 特别是MakeGenericMethodInvoke。但是,您可以使用dynamic

在4.0中作弊
dynamic dictionary = Activator.CreateInstance(propertyType);
HackyHacky(dictionary);

使用:

void HackyHacky<TKey,TValue>(Dictionary<TKey, TValue> data) {
    TKey ...
    TValue ...
}