2009-11-28 45 views
2

我有以下代碼,其中ApplicationType是一個枚舉。我在其他許多枚舉中使用了相同的重複代碼(除參數類型之外的所有內容)。什麼是鞏固這些代碼的最佳方式?如何使任何枚舉的方法工作

private static string GetSelected(ApplicationType type_, ApplicationType checkedType_) 
    { 
     if (type_ == checkedType_) 
     { 
      return " selected "; 
     } 
     else 
     { 
      return ""; 
     } 
    } 
+0

更新了我的答案,不要太可怕,可怕,錯誤。對於那個很抱歉。 – 2009-11-28 04:56:43

回答

2

從髖關節,沿東西線拍攝...

private static string GetSelected<T>(T type_, T checkedType_) where T : System.Enum{ 
    //As before 
} 

顯然,這是非法的。

要簡單地削減重複,你可以只用枚舉正是如此替換T,

private static String GetSelected(Enum type_, Enum checkedType_){ 
    if(type_.CompareTo(_checkedType) == 0) return "selected"; 

    return ""; 
} 

雖然這並不在類型安全的方式得到你很多,作爲兩個不同的枚舉類型,可以通過在

您可以改爲在運行時失敗:

private static String GetSelected(Enum type_, Enum checkedType_){ 
    if(type_.GetType() != checkedType.GetType()) throw new Exception(); 
    //As above 
} 

爲了得到一些你可以使用通用約束編譯時的安全性,但因爲你不能使用枚舉類,你將不能夠限制一切:

private static String GetSelected<T>(T type_, T checkedType_) where T : IComparable, IFormattable, IConvertible{ 
    if(!(first is Enum)) throw new Exception(); 
    //As above 
} 

以上將確保你只能通過相同類型的枚舉(如果你在兩個不同的枚舉傳給你會得到一個類型推斷的錯誤),但將在符合T約束條件的非Enum條件通過時進行編譯。

不幸的是,這裏似乎沒有很好的解決方案。

+0

*約束不能是特殊類'System.Enum'* – 2009-11-28 03:59:51

+0

您需要使用關鍵字「struct」,因爲枚舉不起作用。您可以在運行時進一步進行類型檢查,以確保它實際上是一個枚舉。 – Josh 2009-11-28 04:04:21

+0

這是**大規模**矯枉過正... – 2009-11-28 10:02:02

0

在編譯時通過通用約束很難做到這一點,因爲enum實際上是int。您需要在運行時限制這些值。

+1

實際上,C#枚舉通常是* int。 – 2009-11-28 09:54:49

+0

Whups是我一直在努力的最新項目,它將枚舉映射到數據庫中的一個字節 - 令人困惑。我會更新答案。謝謝! – 2009-11-29 06:46:42

0

對於emum平等嗎?簡單地說:

public static string GetSelected<T>(T x, T y) { 
    return EqualityComparer<T>.Default.Equals(x,y) ? " selected " : ""; 
} 

可以添加where T : struct的頂線,但沒有一個需要做到這一點。

對於一個完整的例子包括演示:

using System; 
using System.Collections.Generic; 
static class Program { 
    static void Main() { 
     ApplicationType value = ApplicationType.B; 
     Console.WriteLine("A: " + GetSelected(value, ApplicationType.A)); 
     Console.WriteLine("B: " + GetSelected(value, ApplicationType.B)); 
     Console.WriteLine("C: " + GetSelected(value, ApplicationType.C)); 
    } 
    private static string GetSelected<T>(T x, T y) { 
     return EqualityComparer<T>.Default.Equals(x, y) ? " selected " : ""; 
    } 
    enum ApplicationType { A, B, C } 
} 
0

這是適合您的需求呢?

private static string GetSelected<T>(T type_, T checkedType_) 
    where T: struct 
{ 
    if(type_.Equals(checkedType_)) 
     return " selected "; 
    return ""; 
}