Есть ли способ для общего возврата значения из набора словарей с различными типами значений? - PullRequest
0 голосов
/ 27 февраля 2019

Проблема, которую я продолжаю затрагивать в своем коде, выглядит следующим образом:

public Dictionary<string, int> NumericProperties { get; set; }
public Dictionary<string, string> TextProperties { get; set; }
public Dictionary<string, string[]> CollectionProperties { get; set; }
public Dictionary<string, KeyValue[]> DependencyProperties { get; set; }

public T GetProperty<T>(string name)
{
  //find out which property dictionary and return value
}

Есть ли способ сделать это эффективно в C #?Еще одна мысль, которая у меня возникла, заключалась в том, чтобы создать один Dictionary типа <string, object> и использовать его (я знаю, что нет типа generic Dictionary, который я тоже могу использовать), и тогда это был бы просто случай, возвращающийобъект, который может быть Pattern Matched, чтобы найти свой оригинальный тип.

Проблема с этой опцией заключается в boxing и un-boxing переменных, а также в том, что она теряет свою общую природу.Другим вариантом является создание абстрактного базового класса для Property, однако, поскольку каждое свойство будет состоять из пары имя-значение и, следовательно, потребует снова generics, и мы попадаем в ту же проблему, пытаясь динамически возвращать разные Types.

Любая помощь будет высоко ценится!Благодаря.

1 Ответ

0 голосов
/ 27 февраля 2019

Вы можете создать словарь доступных словарей.Либо инициализируйте известные типы словарей вручную, либо позвольте этому автоматически выполнять метод SetProperty.

public static Dictionary<Type, object> PropertDicts { get; } = new Dictionary<Type, object>();

public static void SetProperty<T>(string name, T value)
{
    Dictionary<string, T> typedDict;
    if (PropertDicts.TryGetValue(typeof(T), out object dict)) {
        typedDict = (Dictionary<string, T>)dict;
    } else {
        typedDict = new Dictionary<string, T>();
        PropertDicts.Add(typeof(T), typedDict);
    }
    typedDict[name] = value;
}

public static T GetProperty<T>(string name)
{
    if (PropertDicts.TryGetValue(typeof(T), out object dict)) {
        var typedDict = (Dictionary<string, T>)dict;
        if (typedDict.TryGetValue(name, out T value)) {
            return value;
        }
    }
    return default(T);
}

Но дженерики работают только в том случае, если вы знаете тип имущества в adavance.Для полностью динамических сценариев генерики бесполезны.

...