Как создать универсальный словарь C # динамически в зависимости от типа свойства в классе? - PullRequest
3 голосов
/ 18 января 2012

Я пытаюсь динамически создать универсальный словарь на основе типа свойства в следующем классе:

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

Предположим, что System.Type свойства Stats назначен переменной 'propertyTypeи что метод IsGenericDictionary возвращает true, если тип является универсальным словарем.Затем я использую Activator.CreateInstance для динамического создания экземпляра универсального словаря того же типа:

// 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 Ответ

6 голосов
/ 18 января 2012

Если вы хотите сделать это, вам нужно будет использовать отражение или dynamic, чтобы переключиться на универсальный метод, и использовать аргументы универсального типа.Без этого вам придется использовать object.Лично я бы просто использовал не универсальный IDictionary API здесь:

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

, который дает вам доступ к данным и всем обычным методам, которые вы ожидаете в словаре (но: использование object).Задействовать общий метод - это боль;для этого до версии 4.0 требуется рефлексия - в частности MakeGenericMethod и Invoke.Вы можете, однако, обмануть в 4.0, используя dynamic:

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

с:

void HackyHacky<TKey,TValue>(Dictionary<TKey, TValue> data) {
    TKey ...
    TValue ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...