2013-12-10 57 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()。