帮助Enum扩展方法

时间:2011-02-16 00:00:25

标签: .net c#-4.0

我有enum辅助通用类,其中我有方法EnumDescription() 要打电话给我,我必须像那样EnumHelper<Enumtype>.EnumDescription(value) 我想实现基于我的枚举辅助方法enum

EnumDescription(this Enum value)扩展方法EnumHelper<T>.EnumDescription(value)

我坚持一件事。这是我的代码:

public static string EnumDescription(this Enum value)
{
    Type type = value.GetType();

    return EnumHelper<type>.EnumDescription(value); //Error here
}

我收到错误The type or namespace name 'type' could not be found (are you missing a using directive or an assembly reference?)

我有什么办法可以让它发挥作用吗?

2 个答案:

答案 0 :(得分:3)

我能想到的两个选项(可能还有更多)。

第一个选项:使扩展方法通用。 C#不允许enum作为通用约束,这意味着您需要运行时检查以确保该类型实际上是enum

public static string EnumDescription<T>(this T value)
    where T : struct, IComparable, IConvertible, IFormattable
{
    if (!typeof(T).IsEnum)
        throw new InvalidOperationException("Type argument T must be an enum.");

    return EnumHelper<T>.EnumDescription(value);
}

第二个选项:使用反射。虽然您可以从MethodInfo创建委托并将其缓存以便在Dictionary<Type, Delegate>或类似地方重复使用,但这将很慢(呃)。这样,在第一次遇到特定类型时,您只会产生反射成本。

public static string EnumDescription(this Enum value)
{
    Type t = value.GetType();
    Type g = typeof(EnumHelper<>).MakeGenericType(t);
    MethodInfo mi = g.GetMethod("EnumDescription");
    return (string)mi.Invoke(null, new object[] { value });
}

答案 1 :(得分:1)

泛型是在编译时完成的。

您可以将方法更改为通用方法where T : struct,也可以使用Reflection调用内部方法。