调用函数<t> </t>

时间:2013-12-10 09:03:31

标签: c# function syntax

您好我不知道如何调用下一个功能,请您在这里帮助我。

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

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

3 个答案:

答案 0 :(得分:3)

此函数表示Enum类型的extension method。您无法在string上调用它,因为它正在尝试执行,因为它会在运行时爆炸。查看函数内部如何检查通用T参数是否为枚举。不幸的是,枚举类型没有通用约束。

假设你有以下枚举类型:

public enum MyEnum
{
    Foo, Bar, Baz
}

以及此枚举的一个实例:

MyEnum e = MyEnum.Bar;

你可以调用扩展方法:

e.FailIfEnumIsNotDefined();

或:

e.FailIfEnumIsNotDefined("some message");

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

答案 1 :(得分:0)

假设您已定义任何enum

    public enum MyEnum
    {
        One,
        Two
    }

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

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

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

答案 2 :(得分: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()。