【问题标题】:Calling function<T>调用函数<T>
【发布时间】:2013-12-10 09:03:30
【问题描述】:

您好,我不知道如何调用下一个函数,请您帮帮我。

函数检查值是否定义为枚举值。如果不是,则抛出异常。 警告:[Flag] 类型的枚举失败

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

【问题讨论】:

  • 您必须向我们提供有关该功能应该做什么的更多信息
  • stringclass 而不是 struct 并且您调用该方法的方式不正确。
  • 对提供的枚举类型进行扩展似乎没有用。您需要对字符串或对象进行扩展。如果您需要,请检查我的答案

标签: c# function syntax


【解决方案1】:

此函数表示 Enum 类型的 extension method。您不能像当前尝试那样在string 上调用它,因为它会在运行时发生故障。看看它如何在函数内部检查泛型 T 参数是否为枚举。不幸的是,枚举类型没有通用约束。

所以假设你有以下枚举类型:

public enum MyEnum
{
    Foo, Bar, Baz
}

以及这个枚举的一个实例:

MyEnum e = MyEnum.Bar;

你可以调用扩展方法:

e.FailIfEnumIsNotDefined();

或:

e.FailIfEnumIsNotDefined("some message");

另外,不要忘记通过将正确的 using 指令添加到定义此方法的命名空间来将扩展方法纳入范围。

【讨论】:

    【解决方案2】:

    假设你定义了任何enum:

        public enum MyEnum
        {
            One,
            Two
        }
    

    然后,您可以使用以下方式调用您的扩展方法:

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

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

    【讨论】:

      【解决方案3】:

      如果你想解析任何字符串或对象,你应该为字符串或对象创建扩展,如下所示:

       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()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多