简体   繁体   中英

How to create a C# generic dictionary dynamically based on the type of a property in a class?

I am trying to dynamically create a generic Dictionary based on the type of a property in the following class:

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

Let's assume the System.Type of the Stats property is assigned to a variable 'propertyType' and that the IsGenericDictionary method returns true if the type is a generic dictionary. I then use Activator.CreateInstance to dynamically create a generic Dictionary instance of the same type:

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

Since I already know that the object that is created is a generic dictionary I would like to cast to a generic dictionary whose type arguments equal the generic arguments of the property type:

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

Is this possible?

If you want to do that, you'll have to use reflection or dynamic to flip over into a generic method, and use the generic type arguments. Without that, you have to use object . Personally, I'd just use the non-generic IDictionary API here:

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

which gives you access to the data, and all the usual methods you expect on a dictionary (but: using object ). Flipping into a generic method is a pain; to do it pre-4.0 requires reflection - specifically MakeGenericMethod and Invoke . You can, however, cheat in 4.0 using dynamic :

dynamic dictionary = Activator.CreateInstance(propertyType);
HackyHacky(dictionary);

with:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM