2013-10-01 90 views
2

我有以下的方法,該方法需要一個類的類型作爲參數:C#轉換爲類型的一類

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語句允許我決定將哪個容器放入以獲取對象。

+1

把你的代碼放在這裏,它可能是一些愚蠢的,一個開關應該沒有任何問題 –

+1

方法'測試(類型proType)'的目的是什麼?它怎麼叫?你在做'test(typeof(someObj))'嗎?如何在每種你正在測試的類型上用已知的接口方法封裝每個案例的代碼? – spender

+0

可能應該尋找一個通用的解決方案 – jltrem

回答

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

和所有開關邏輯消失。田田!

1

如果您感興趣的類型位於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; 
    } 
} 
3

它是什麼,你是真的試圖實現。我猜測10次中有9次,當你切換某種物體的類型時,你的設計是有缺陷的。虛擬調度或多態(或兩者)是大多數情況下你真正想要的,但不知道你想要解決什麼問題,我們不能肯定地說。

+0

更新的問題與更多詳細信息 – LmC

3

我通常會使用字典爲每種類型創建緩存的操作;在啓動時加載它,如果預先知道類型,或使用TryGetValue並在失敗時填充。

+0

這就是'switch'語句的作用。這兩種解決方案几乎完全相同。 – Servy