以此枚举为例:
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。
答案 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。