使用Case / Switch和GetType来确定对象

可能重复:
C# - 有没有比'开启类型'更好的选择?

如果你想switch一个类型的对象,最好的办法是什么?

代码片段

private int GetNodeType(NodeDTO node)
{
    switch (node.GetType())
    { 
        case typeof(CasusNodeDTO):
            return 1;
        case typeof(BucketNodeDTO):
            return 3;
        case typeof(BranchNodeDTO):
            return 0;
        case typeof(LeafNodeDTO):
            return 2;
        default:
            return -1;
    }
}

我知道这种方式不行,但我想知道你如何解决这个问题。 在这种情况下, if/else语句是否恰当?

或者你使用开关并将.ToString()添加到类型?


如果我真的必须switch对象的类型,我会使用.ToString() 。 然而,我会不惜一切代价避免它: IDictionary<Type, int>会做得更好,访问者可能是一种矫枉过正,但否则它仍然是一个完美的解决方案。


这不会直接解决您的问题,因为您希望切换自己的用户定义类型,但为了其他只想打开内置类型的用户的利益,可以使用TypeCode枚举:

switch (Type.GetTypeCode(node.GetType()))
{
    case TypeCode.Decimal:
        // Handle Decimal
        break;

    case TypeCode.Int32:
        // Handle Int32
        break;
     ...
}

在MSDN博文中有许多问题:切换类型是为什么.NET不提供类型切换的一些信息。

像往常一样 - 变通办法始终存在。

这不是我的,但不幸的是我已经失去了消息来源。 它使得切换类型成为可能,但我个人认为它很尴尬(字典的想法更好):

  public class Switch
  {
      public Switch(Object o)
      {
          Object = o;
      }

      public Object Object { get; private set; }
  }


  /// <summary>
  /// Extensions, because otherwise casing fails on Switch==null
  /// </summary>
  public static class SwitchExtensions
  {
      public static Switch Case<T>(this Switch s, Action<T> a)
            where T : class
      {
          return Case(s, o => true, a, false);
      }

      public static Switch Case<T>(this Switch s, Action<T> a,
           bool fallThrough) where T : class
      {
          return Case(s, o => true, a, fallThrough);
      }

      public static Switch Case<T>(this Switch s,
          Func<T, bool> c, Action<T> a) where T : class
      {
          return Case(s, c, a, false);
      }

      public static Switch Case<T>(this Switch s,
          Func<T, bool> c, Action<T> a, bool fallThrough) where T : class
      {
          if (s == null)
          {
              return null;
          }

          T t = s.Object as T;
          if (t != null)
          {
              if (c(t))
              {
                  a(t);
                  return fallThrough ? s : null;
              }
          }

          return s;
      }
  }

用法:

 new Switch(foo)
     .Case<Fizz>
         (action => { doingSomething = FirstMethodCall(); })
     .Case<Buzz>
         (action => { return false; })
链接地址: http://www.djcxy.com/p/84409.html

上一篇: Using Case/Switch and GetType to determine the object

下一篇: do { ... } while (0) — what is it good for?