Вот вариант, который остается верным, я мог бы выполнить требование OP, чтобы иметь возможность переключаться на тип. Если прищуриться, это почти похоже на настоящий оператор переключения.
Вызывающий код выглядит так:
var @switch = this.Switch(new []
{
this.Case<WebControl>(x => { /* WebControl code here */ }),
this.Case<TextBox>(x => { /* TextBox code here */ }),
this.Case<ComboBox>(x => { /* ComboBox code here */ }),
});
@switch(obj);
x
в каждой лямбде, приведенной выше, строго типизирован. Литье не требуется.
И чтобы это волшебство сработало, вам понадобятся два метода:
private Action<object> Switch(params Func<object, Action>[] tests)
{
return o =>
{
var @case = tests
.Select(f => f(o))
.FirstOrDefault(a => a != null);
if (@case != null)
{
@case();
}
};
}
private Func<object, Action> Case<T>(Action<T> action)
{
return o => o is T ? (Action)(() => action((T)o)) : (Action)null;
}
У тебя почти слезы на глазах, правда?
Тем не менее, это работает. Наслаждаться.
31.08.2011
return typeof(T) switch {IThingOne _ => new ThingOne(), _ => throw new NotImplementedException()};
:( 03.05.2019