Я пытаюсь разобраться в лучших практиках работы с универсальным словарем, в котором хранится List. Я использовал все: унаследованный словарь, созданный словарь и методы расширения. На мой взгляд, методы расширения кажутся наиболее простым подходом, поскольку здесь не используется еще один новый класс. В моем случае я пытаюсь загрузить словарь List для привязки к моим поискам во внешнем интерфейсе. Какой способ сделать это наиболее подходящий? В каком сценарии мне следует использовать каждый из них?
Вот мои реализации:
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}'");
}
}
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");
}
}
Я пытаюсь разобраться в лучших практиках работы с универсальным словарем, в котором хранится List. Я использовал все: унаследованный словарь, созданный словарь и методы расширения. На мой взгляд, методы расширения кажутся наиболее простым подходом, поскольку здесь не используется еще один новый класс. В моем случае я пытаюсь загрузить словарь List для привязки к моим поискам во внешнем интерфейсе. Какой способ сделать это наиболее подходящий? В каком сценарии мне следует использовать каждый из них? Вот мои реализации: [list] [*]Inherited Dictionary [code]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}"); } } [/code]
[*]Методы расширения [code]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}'"); } } [/code] 3. Создан [code]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!;