Наследование словаря, экземпляр словаря и методы расширения при работе с универсальными словарямиC#

Место общения программистов C#
Ответить
Anonymous
 Наследование словаря, экземпляр словаря и методы расширения при работе с универсальными словарями

Сообщение Anonymous »

Я пытаюсь разобраться в лучших практиках работы с универсальным словарем, в котором хранится List. Я использовал все: унаследованный словарь, созданный словарь и методы расширения. На мой взгляд, методы расширения кажутся наиболее простым подходом, поскольку здесь не используется еще один новый класс. В моем случае я пытаюсь загрузить словарь List для привязки к моим поискам во внешнем интерфейсе. Какой способ сделать это наиболее подходящий? В каком сценарии мне следует использовать каждый из них?
Вот мои реализации:
  • Inherited Dictionary

    Код: Выделить всё

    public class GenericDictionary: Dictionary
    {
    public T GetValue(string key)
    {
    if(TryGetValue(key,out var value) && value is T val)
    return val;
    if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(List))
    {
    var emptyList = Activator.CreateInstance(typeof(T));
    return (T)emptyList!;
    }
    throw new InvalidOperationException($"Type mismatch on key {key}");
    }
    }
    
  • Методы расширения

    Код: Выделить всё

    public static class GenericDictionaryExtensions
    {
    public static T GetList(this Dictionary dict, string key)
    {
    if (dict.TryGetValue(key, out var value))
    {
    if (value is T typedValue)
    return typedValue;
    
    if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(List)
    && value is IEnumerable enumerable)
    {
    var list = Activator.CreateInstance(typeof(T), enumerable)!;
    return (T)list;
    }
    }
    
    if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(List))
    {
    return (T)Activator.CreateInstance(typeof(T))!;
    }
    throw new InvalidOperationException($"Type mismatch on key '{key}'");
    }
    }
    
    3. Создан

    Код: Выделить всё

    public class GenericDictionary
    {
    private Dictionary _dict = new();
    public T GetValue(string key)
    {
    if (_dict.TryGetValue(key, out var value) && value is T typedValue)
    return typedValue;
    
    if (typeof(T).IsGenericType && typeof(T).GetGenericTypeDefinition() == typeof(List))
    {
    var emptyList = Activator.CreateInstance(typeof(T));
    return (T)emptyList!;
    
    }
    throw new InvalidOperationException($"type doesnt match");
    }
    }
    
    Изменить: опечатка


Подробнее здесь: https://stackoverflow.com/questions/798 ... -when-work
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»