帮助创建Enum扩展助手

时间:2010-02-18 22:39:21

标签: c# .net

以此枚举为例:

public enum PersonName : short
{
    Mike = 1,
    Robert= 2
}

我想要这样的扩展方法:

PersonName person = PersonName.Robert;
short personId = person.GetId();
//Instead of:
short personId = (short)person;

知道如何实现这个吗?

它必须是int,short等的通用,以及通用枚举,不仅限于PersonName。

5 个答案:

答案 0 :(得分:2)

这完全不可能。

您不能基于enum的基础类型约束方法。

说明:

以下是您尝试执行此操作的方法:

public static TNumber GetId<TEnum, TNumber>(this TEnum val) 
       where TEnum : Enum 
       where TEnum based on TNumber

第一个约束是unfortunately not allowed by C#,CLR不支持第二个约束。

答案 1 :(得分:2)

嗯,这种可能性,但另一方面,您必须指定底层类型:

public static T GetId<T>(this Enum value) 
                        where T : struct, IComparable, IFormattable, IConvertible
{
    return (T)Convert.ChangeType(value, typeof(T));
}

因为System.Enum是所有枚举类型的基类。叫它:

PersonName person = PersonName.Robert;
short personId = person.GetId<short>();

由于您几乎可以将任何内容投射到long,您甚至可以拥有:

public static long GetId(this Enum value)
{
    return Convert.ToInt64(value);
}

并致电:

PersonName person = PersonName.Robert;
long personId = person.GetId();

否则可能会返回一个object实例,就像这样:

public static object GetId(this Enum value)
{
    return Convert.ChangeType(task, Enum.GetUnderlyingType(value.GetType()));
}

PersonName person = PersonName.Robert;
var personId = (short)person.GetId(); 
// but that sort of defeats the purpose isnt it?

所有这些都涉及某种拳击和拆箱。第二种方法看起来更好(你甚至可以使它成为标准类型int,然后是第一种方法。

答案 2 :(得分:0)

我相信你应该能够在PersonName类上定义一个扩展方法:

public static class PersonExtensions // now that sounds weird...
{
    public static short GetID (this PersonName name)
    {
        return (short) name;
    }
}

侧节点:我不知何故希望您的问题中的代码过于简化,因为将人员存储库实现为枚举似乎不太正确:)

答案 3 :(得分:0)

有什么理由你不能把它变成一个班级吗?它可能在课堂上更有意义。

答案 4 :(得分:0)

我会使用类似IEnumerable<KeyValuePair<string,short>>Dictionary<string,short>的内容...如果需要,可以将扩展名添加到IDictionary或IEnumerable。