猿问

有比这更好的替代“打开类型”吗?

有比这更好的替代“打开类型”吗?

认为C#不能开关关于类型(我认为它不是作为特例添加的,因为is-关系意味着不止一个不同的关系)案例(可能适用),是否有更好的方法来模拟切换类型?

void Foo(object o){
    if (o is A)
    {
        ((A)o).Hop();
    }
    else if (o is B)
    {
        ((B)o).Skip();
    }
    else
    {
        throw new ArgumentException("Unexpected type: " + o.GetType());
    }}


白猪掌柜的
浏览 396回答 3
3回答

至尊宝的传说

用C#7,它附带于VisualStudio 2017(第15.*版),您可以在case语句(模式匹配):switch(shape){ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Circle&nbsp;c: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine($"circle&nbsp;with&nbsp;radius&nbsp;{c.Radius}"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Rectangle&nbsp;s&nbsp;when&nbsp;(s.Length&nbsp;==&nbsp;s.Height): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine($"{s.Length}&nbsp;x&nbsp;{s.Height}&nbsp;square"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Rectangle&nbsp;r: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine($"{r.Length}&nbsp;x&nbsp;{r.Height}&nbsp;rectangle"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;default: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteLine("<unknown&nbsp;shape>"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;null: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ArgumentNullException(nameof(shape));}使用C#6,您可以在()运算符(谢谢@乔伊·亚当斯):switch(o.GetType().Name)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;nameof(AType): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;nameof(BType): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;}使用C#5和更早版本,您可以使用Switch语句,但是您必须使用包含类型名称的魔术字符串.这对重构并不是特别友好的(谢谢@nuke聚变)switch(o.GetType().Name)&nbsp;{ &nbsp;&nbsp;case&nbsp;"AType": &nbsp;&nbsp;&nbsp;&nbsp;break;}

MMTTMM

一种选择是从Type到Action(或其他代表)。根据类型查找操作,然后执行它。我以前在工厂用过这个。
随时随地看视频慕课网APP
我要回答