2011-02-24 112 views
0

我有一個IEnumerable,將其轉換成字符串列表的一個ToString擴展方法如下:枚舉數組爲字符串

public static string ToString<T>(this IEnumerable<T> theSource, 
            string theSeparator) where T : class 
    { 
     string[] array = 
        theSource.Where(n => n != null).Select(n => n.ToString()).ToArray(); 

     return string.Join(theSeparator, array); 
    } 

我現在想要做同樣的事情用枚舉的數組:給定theXStatuses ,一個XStatus枚舉值的數組,我想獲取一個包含由Separator分隔的枚舉值的字符串。出於某種原因,上述擴展方法不適用於XStatus []。所以,我想

 public static string ToString1<T>(this IEnumerable<T> theSource,string theSeparator) 
                      where T : Enum 

但後來我得到了一個錯誤,「不能使用...‘System.Enum’...類型參數約束。

有什麼辦法來實現這一目標?

+1

這是C#,對不對?你應該添加標籤到你的問題(我會這樣做,但我不是100%肯定它是C#)。 – Pointy 2011-02-24 13:35:55

回答

4

沒有不能做最接近的將是where T : struct如果不枚舉

編輯不是拋出內部函數錯誤: 如果您從原來的功能刪除where T : class該宏將會我也致力於枚舉。 也跳過ToArray()作爲字符串。加入需要IEnumerable<string>

1

馬格納斯是正確的,它不能完成,優雅。這個限制可以用一個小小的黑客來繞過,像這樣:

public static string ToString<TEnum>(this IEnumerable<TEnum> source, 
          string separator) where TEnum : struct 
{ 
    if (!typeof(TEnum).IsEnum) throw new InvalidOperationException("TEnum must be an enumeration type. "); 
    if (source == null || separator == null) throw new ArgumentNullException(); 
    var strings = source.Where(e => Enum.IsDefined(typeof(TEnum), e)).Select(n => Enum.GetName(typeof(TEnum), n)); 
    return string.Join(separator, strings); 
}