【问题标题】:C# Switch For Types Of A ClassC# 切换类的类型
【发布时间】:2013-10-01 13:46:15
【问题描述】:

我有以下方法,它以类的类型作为参数:

public void test(Type proType){

}

我目前有一个大的if else,看起来像:

if(proType == typeof(Class)){}

大约有十个,这看起来很不整洁。

我试着把它变成一个开关,但不能让它工作。

有没有更好的做法来让 switch 语句起作用?

           switch (proType)
            {
                case typeof(ClassName):
                    break;
            }

“需要一个常数值”

函数被称为test(typeof(class))

所以目标是我有一个包含许多小类的大对象。

typeof(class) switch/if 语句允许我决定进入哪个容器来取出对象。

【问题讨论】:

  • 把你的代码放在这里,这可能是愚蠢的,一个开关应该没有任何问题
  • 方法test(Type proType)的目的是什么?怎么称呼?你在做类似test(typeof(someObj)) 的事情吗?如何将每个案例的代码封装在您正在测试的每种类型的已知接口方法中?
  • 可能应该寻找通用解决方案
  • switch 对 Type 类型的对象不起作用 - “预期的整数类型”错误
  • 打开字体通常是设计损坏的好兆头。面向对象的语言通常提供更好的方法。

标签: c# if-statement switch-statement typeof


【解决方案1】:

那么,如何让您正在测试的所有对象共享一个公共接口?

 interface ITestable
 {
     void DoSomething();
 }

每个对象都以不同的方式实现这个接口:

 class MySomething : ITestable
 {
     public void DoSomething()
     {
         //type specific implementation
     }
 }

 class MyOtherSomething : ITestable
 {
     public void DoSomething()
     {
         //type specific implementation
     }
 }

现在:

 foreach(ITestable testable in myTestablesList)
 {
     testable.DoSomething();
 }

你所有的切换逻辑都消失了。多田!

【讨论】:

    【解决方案2】:

    您真正想要达到的目标是什么。我猜 10 次中有 9 次,当你切换某个对象的类型时,你的设计是有缺陷的。在大多数情况下,虚拟调度或多态性(或两者兼有)是您真正需要的,但在不知道您要解决的问题是什么的情况下,无法确定。

    【讨论】:

    • 更新了更多细节的问题
    【解决方案3】:

    我通常使用字典来为每种类型创建一个动作缓存;如果预先知道类型,则在启动时加载它,或者使用 TryGetValue 并在失败时填充。

    【讨论】:

    • 这正是switch 语句的作用。这两种解决方案几乎相同。
    【解决方案4】:

    如果您感兴趣的类型在 TypeCode 枚举中,您可以使用 switch(Type.GetTypeCode(proType))。比如来自docs:

    static void WriteObjectInfo(object testObject)
    {
        TypeCode    typeCode = Type.GetTypeCode( testObject.GetType() );
    
        switch( typeCode )
        {
            case TypeCode.Boolean:
                Console.WriteLine("Boolean: {0}", testObject);
                break;
    
            case TypeCode.Double:
                Console.WriteLine("Double: {0}", testObject);
                break;
    
            default:
                Console.WriteLine("{0}: {1}", typeCode.ToString(), testObject);
                break;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2012-02-23
      • 2015-06-16
      相关资源
      最近更新 更多