为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
白猪掌柜的 2019-06-23 16:15:59
有比这更好的替代“打开类型”吗?认为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());     }}
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

用C#7,它附带于VisualStudio 2017(第15.*版),您可以在case语句(模式匹配):

switch(shape){
    case Circle c:
        WriteLine($"circle with radius {c.Radius}");
        break;
    case Rectangle s when (s.Length == s.Height):
        WriteLine($"{s.Length} x {s.Height} square");
        break;
    case Rectangle r:
        WriteLine($"{r.Length} x {r.Height} rectangle");
        break;
    default:
        WriteLine("<unknown shape>");
        break;
    case null:
        throw new ArgumentNullException(nameof(shape));}

使用C#6,您可以在()运算符(谢谢@乔伊·亚当斯):

switch(o.GetType().Name) {
    case nameof(AType):
        break;
    case nameof(BType):
        break;}

使用C#5和更早版本,您可以使用Switch语句,但是您必须使用包含类型名称的魔术字符串.这对重构并不是特别友好的(谢谢@nuke聚变)

switch(o.GetType().Name) {
  case "AType":
    break;}




查看完整回答
反对 回复 2019-06-23
?
MMTTMM

TA贡献1869条经验 获得超4个赞

一种选择是从TypeAction(或其他代表)。根据类型查找操作,然后执行它。我以前在工厂用过这个。


查看完整回答
反对 回复 2019-06-23
  • 3 回答
  • 0 关注
  • 395 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信