当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用Case/Switch和GetType来确定对象》经验,为你挑选了8个好方法。

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

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

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

@splattne不应将“ ...”作为代码的一部分,因为实际上“ ...”不是代码。不过,我可以看到一个论点,以使其更易于阅读。但是缩进...我不知道您怎么称呼它为“修复”,仅因为它就是您现在喜欢的方式。我没有看到有关如何缩进代码的任何StackOverflow准则。仅此问题就有各种各样的样式。 (2认同)


Anton Gogole.. 76

如果我真的不得不switch使用对象类型,我会使用.ToString().但是,我会不惜一切代价避免它:IDictionary会做得更好,访客可能是一个矫枉过正,但否则它仍然是一个非常好的解决方案.



1> Ashley..:

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

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

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


@splattne不应将“ ...”作为代码的一部分,因为实际上“ ...”不是代码。不过,我可以看到一个论点,以使其更易于阅读。但是缩进...我不知道您怎么称呼它为“修复”,仅因为它就是您现在喜欢的方式。我没有看到有关如何缩进代码的任何StackOverflow准则。仅此问题就有各种各样的样式。

2> Anton Gogole..:

如果我真的不得不switch使用对象类型,我会使用.ToString().但是,我会不惜一切代价避免它:IDictionary会做得更好,访客可能是一个矫枉过正,但否则它仍然是一个非常好的解决方案.



3> Arnis Lapsa..:

在MSDN博客文章中的许多问题:开启类型是关于为什么.NET不提供切换类型的一些信息.

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

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

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

      public Object Object { get; private set; }
  }


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

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

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

      public static Switch Case(this Switch s,
          Func c, Action 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
         (action => { doingSomething = FirstMethodCall(); })
     .Case
         (action => { return false; })


非常酷,虽然这是一个相当昂贵的模式,导致GC相对较长的时间.但仍然非常可读......

4> bjaxbjax..:

我遇到了同样的问题并且发现了这篇文章.这是IDictionary方法的意思:

Dictionary typeDict = new Dictionary
{
    {typeof(int),0},
    {typeof(string),1},
    {typeof(MyClass),2}
};

void Foo(object o)
{
    switch (typeDict[o.GetType()])
    {
        case 0:
            Print("I'm a number.");
            break;
        case 1:
            Print("I'm a text.");
            break;
        case 2:
            Print("I'm classy.");
            break;
        default:
            break;
    }
}

如果是这样,我不能说我喜欢将字典中的数字与case语句进行协调.

这将是理想的,但字典引用会杀死它:

void FantasyFoo(object o)
{
    switch (typeDict[o.GetType()])
    {
        case typeDict[typeof(int)]:
            Print("I'm a number.");
            break;
        case typeDict[typeof(string)]:
            Print("I'm a text.");
            break;
        case typeDict[typeof(MyClass)]:
            Print("I'm classy.");
            break;
        default:
            break;
    }
}

还有其他我忽略的实现吗?



5> David Wengie..:

我只是使用if语句.在这种情况下:

Type nodeType = node.GetType();
if (nodeType == typeof(CasusNodeDTO))
{
}
else ... 

另一种方法是:

if (node is CasusNodeDTO)
{
}
else ...

第一个示例仅适用于确切类型,后者也检查继承.


第二种类型检查是IS较慢,因为它检查整个类层次结构.

6> Dave Van den..:

你可以这样做:

if (node is CasusNodeDTO)
{
    ...
}
else if (node is BucketNodeDTO)
{
    ...
}
...

虽然那会更优雅,但它可能没有其他一些答案那么高效.



7> 小智..:

你可以这样做:

function void PrintType(Type t) {
 var t = true;
 new Dictionary{
   {typeof(bool), () => Console.WriteLine("bool")},
   {typeof(int),  () => Console.WriteLine("int")}
 }[t.GetType()]();
}

它很清楚,很容易.它比在某处缓存字典慢一点..但是对于很多代码来说这无关紧要..


任何人都在关注为什么这个被低估了?它怎么样不正确或表现不好?
这是一个优雅的解决方案,对大量类型有效,并清楚地传达了作者的意图.

8> sharptooth..:

一种方法是向NodeDTO添加纯虚拟GetNodeType()方法,并在后代中覆盖它,以便每个后代返回实际类型.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有