Во-первых, почему Dictionary<TKey, TValue>
не поддерживает один пустой ключ?
Во-вторых, существует ли существующая коллекция, подобная словарю?
Я хочу сохранить "пустой" или "отсутствующий" или "по умолчанию" 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)
Работает отлично, если вы не попытаетесь добавить случай по умолчанию в "предварительно скомпилированную" версию (исключение из нулевого аргумента).