2013-12-10 86 views
0

你好,我不知道如何調用下一個函數,你可以幫我在這裏。調用函數<T>

函數檢查值是否定義了枚舉值。如果不是,則拋出異常。 警告:失敗爲[國旗]型我已經試過這樣的事情枚舉

public static T FailIfEnumIsNotDefined<T>(this T enumValue, string message = null) 
     where T:struct 
    { 
     var enumType = typeof (T); 

     if (!enumType.IsEnum) 
     { 
      throw new ArgumentOutOfRangeException(string.Format("Type {0} is not an Enum, therefore it cannot be checked if it is Defined not have defined.", enumType.FullName)); 
     } 
     else if (!Enum.IsDefined(enumType, enumValue)) 
     { 
      throw new ArgumentOutOfRangeException(string.Format("{1} Value {0} is not does not have defined value in Enum of type {0}. It should not be...", enumType.FullName, message ?? "")); 
     } 

     return enumValue; 
    } 

,但我得到的錯誤。

 var valueFormatted = tobeTested.FailIfNullOrEmptyEnumerable<string>(); 
+0

你將不得不給我們更多關於該函數應該做什麼的信息 – RononDex

+1

'string'是'class'而不是'struct',你調用方法的方式不正確。 – Ric

+0

對提供的枚舉類型進行擴展似乎沒有用處。您需要擴展字符串或對象。檢查我的答案,如果這是你需要的 – Akanksha

回答

3

此函數表示Enum類型的extension method。您不能像當前正在嘗試的那樣在string上調用它,因爲它會在運行時造成衝擊。看看函數內部如何檢查泛型T參數是否爲枚舉。不幸的是,對枚舉類型沒有通用的約束。

因此,假設您有以下枚舉類型:

public enum MyEnum 
{ 
    Foo, Bar, Baz 
} 

與該枚舉的一個實例:

MyEnum e = MyEnum.Bar; 

你可以調用擴展方法:

e.FailIfEnumIsNotDefined(); 

或:

e.FailIfEnumIsNotDefined("some message"); 

另外不要忘記通過在定義了此方法的命名空間中添加正確的using指令來使範圍擴展方法生效。

0

假設你定義了任何enum

public enum MyEnum 
    { 
     One, 
     Two 
    } 

然後,您可以通過撥打您的擴展方法:

MyEnum enumValue = MyEnum.One; 
enumValue.FailIfEnumIsNotDefined<MyEnum>(); 

enumValue.FailIfEnumIsNotDefined<MyEnum>("error message"); 
0

如果你想分析的任何字符串或對象,你應該創建字符串或對象的擴展名,如下所示:

public static T FailIfEnumIsNotDefined<T>(this object enumValue, string message = null) where T : struct 
     { 
      var enumType = typeof(T); 

      if (!enumType.IsEnum) 
      { 
       throw new ArgumentOutOfRangeException("..."); 
      } 
      else if (!Enum.IsDefined(enumType, enumValue)) 
      { 
       throw new ArgumentOutOfRangeException("..."); 
      } 

      return (T)Enum.Parse(enumType, enumValue.ToString());// (T)enumValue; 
     } 

用途如下

var a = "One".FailIfEnumIsNotDefined<MyEnum>(); 

public enum MyEnum 
    { 
     One, 
     Two 
    } 

這應該解決的問題。

如果您正在爲字符串創建擴展名,則不必在解析中執行ToString()。