2

我有以下方法,该方法将类类型作为参数:

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 语句允许我决定进入哪个容器来取出对象。

4

4 回答 4

7

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

 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();
 }

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

于 2013-10-01T13:56:17.493 回答
3

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

于 2013-10-01T13:54:06.300 回答
3

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

于 2013-10-01T13:54:43.997 回答
1

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

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;
    }
}
于 2013-10-01T13:50:00.217 回答