C# 创建枚举扩展帮助程序的帮助

C# 创建枚举扩展帮助程序的帮助,c#,.net,C#,.net,以这个枚举为例: public enum PersonName : short { Mike = 1, Robert= 2 } 我希望有这样的en扩展方法: 你知道如何实现这一点吗 它需要是int、short等的泛型,以及泛型枚举,而不限于PersonName 我相信您应该能够在PersonName类上定义扩展方法: public static class PersonExtensions // now that sounds weird... { public sta

以这个枚举为例:

public enum PersonName : short
{
    Mike = 1,
    Robert= 2
}
我希望有这样的en扩展方法:

你知道如何实现这一点吗


它需要是int、short等的泛型,以及泛型枚举,而不限于PersonName

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

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

侧节点:我希望您问题中的代码过于简化,因为将个人存储库实现为枚举似乎不太合适:)

有什么理由不能将其转换为类吗?在类的上下文中,它可能更有意义。

我只会使用类似于
IEnumerable
Dictionary
。。。如果需要,可以将扩展添加到IDictionary或IEnumerable。

这是完全不可能的

不能基于
枚举的基础类型约束方法

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

public static TNumber GetId<TEnum, TNumber>(this TEnum val) 
       where TEnum : Enum 
       where TEnum based on TNumber
public static TNumber GetId(此TEnum val)
其中TEnum:Enum
其中TEnum基于TNumber

第一个约束是,而第二个约束不受CLR支持。

好吧,这有点可能,但另一方面,您必须指定基础类型:

public static T GetId<T>(this Enum value) 
                        where T : struct, IComparable, IFormattable, IConvertible
{
    return (T)Convert.ChangeType(value, typeof(T));
}
由于您几乎可以将任何内容转换为
long
,因此您甚至可以拥有以下功能:

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

PersonName person = PersonName.Robert;
long personId = person.GetId();
否则,可能会返回一个
对象
实例,如下所示:

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
),然后是第一种方法。

很好。如何使用reflation获取person属性名?或者每个人都应该归还字典?我会考虑的。但是这个问题对我来说仍然很有趣。我希望它是一个通用的。当然,这是一个例子:)对不起,你的问题中没有提到这一点。恐怕我不知道你在这里所说的“泛型”是什么意思,但似乎其他人已经明白了:)这是不可能的。(您不能基于
枚举的底层类型构造方法)为什么需要扩展方法来实现这一点?转换到底层类型已经像我现在要使用的
(int)SomeEnum.SomeValue
一样简单。但是关于这个问题,这个行为我需要很多时间,但据我所知是不可能实现的。你可以“某种程度上”(好吧,你创造了效果)-另请参见:
PersonName person = PersonName.Robert;
long personId = person.GetId();
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?