Во-первых, Почему не Dictionary<TKey, TValue>
поддерживает один ключ null?Словарь с нулевым ключом?
Во-вторых, существует ли существующая коллекция, подобная словарю?
Я хочу сохранить «пустые» или «отсутствующие» или «по умолчанию» System.Type
, подумал, что null
будет хорошо работать для этого.
Более конкретно, я написал этот класс:
class Switch
{
private Dictionary<Type, Action<object>> _dict;
public Switch(params KeyValuePair<Type, Action<object>>[] cases)
{
_dict = new Dictionary<Type, Action<object>>(cases.Length);
foreach (var entry in cases)
_dict.Add(entry.Key, entry.Value);
}
public void Execute(object obj)
{
var type = obj.GetType();
if (_dict.ContainsKey(type))
_dict[type](obj);
}
public static void Execute(object obj, params KeyValuePair<Type, Action<object>>[] cases)
{
var type = obj.GetType();
foreach (var entry in cases)
{
if (entry.Key == null || type.IsAssignableFrom(entry.Key))
{
entry.Value(obj);
break;
}
}
}
public static KeyValuePair<Type, Action<object>> Case<T>(Action action)
{
return new KeyValuePair<Type, Action<object>>(typeof(T), x => action());
}
public static KeyValuePair<Type, Action<object>> Case<T>(Action<T> action)
{
return new KeyValuePair<Type, Action<object>>(typeof(T), x => action((T)x));
}
public static KeyValuePair<Type, Action<object>> Default(Action action)
{
return new KeyValuePair<Type, Action<object>>(null, x => action());
}
}
Для включения типов. Существует два способа использования:
- Статически. Просто позвоните
Switch.Execute(yourObject, Switch.Case<YourType>(x => x.Action()))
- Предварительно скомпилировано. Создайте переключатель, а затем использовать его позже с
switchInstance.Execute(yourObject)
Прекрасно работает кроме при попытке добавить дело по умолчанию в «скомпилированный» версии (нуль исключение аргумента).
возможно дубликат [C# - Нужна реализация IDictionary что позволит пустой ключ] (http://stackoverflow.com/questions/1916814/c-need-an-idictionary-implementation-that -will-allow-a-null-key) – Gabe
Возможный дубликат [C# - нужна реализация IDictionary, которая позволит использовать нулевой ключ] (https://stackoverflow.com/questions/1916814/c-sharp-need-an -idictionary-implementation-that-will-allow-a-null-key) – DavidRR