如何将扩展方法添加到枚举

我有这个枚举代码:

enum Duration { Day, Week, Month }; 

我可以为这个枚举添加一个扩展方法吗?

根据这个网站 :

扩展方法提供了一种为现有类编写方法的方式,这是您团队中其他人可能实际发现和使用的方式。 鉴于枚举类是任何其他的类,你可以扩展它们不应该太惊讶,如:

 enum Duration { Day, Week, Month }; static class DurationExtensions { public static DateTime From(this Duration duration, DateTime dateTime) { switch duration { case Day: return dateTime.AddDays(1); case Week: return dateTime.AddDays(7); case Month: return dateTime.AddMonths(1); default: throw new ArgumentOutOfRangeException("duration") } } } 

我认为枚举并不是一般的最佳select,但至less可以让你集中一些开关/如果处理和抽象它们,直到你可以做得更好。 请记住检查值也在范围内。

您可以在Microsft MSDN阅读更多。

您还可以将扩展方法添加到枚举types而不是Enum的一个实例:

 /// <summary> Enum Extension Methods </summary> /// <typeparam name="T"> type of Enum </typeparam> public class Enum<T> where T : struct, IConvertible { public static int Count { get { if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type"); return Enum.GetNames(typeof(T)).Length; } } } 

您可以通过执行以下方法调用上述扩展方法:

 var result = Enum<Duration>.Count; 

这不是一个真正的扩展方法。 它只工作,因为枚举<>是一个不同于System.Enum的types。

当然,你可以说,例如,你想在你的enum值上使用DescriptionAttribue

 using System.ComponentModel.DataAnnotations; public enum Duration { [Description("Eight hours")] Day, [Description("Five days")] Week, [Description("Twenty-one days")] Month } 

现在你想能够做到这样的事情:

 Duration duration = Duration.Week; var description = duration.GetDescription(); // will return "Five days" 

你的扩展方法GetDescription()可以写成如下:

 using System.ComponentModel; using System.Reflection; public static string GetDescription(this Enum value) { FieldInfo fieldInfo = value.GetType().GetField(value.ToString()); if (fieldInfo == null) return null; var attribute = (DescriptionAttribute)fieldInfo.GetCustomAttribute(typeof(DescriptionAttribute)); return attribute.Description; } 

你可以创build任何东西,甚至object的扩展(尽pipe这不被认为是最佳做法 )。 了解一个扩展方法就像一个public static方法。 你可以在方法上使用你喜欢的任何参数types。

 public static class DurationExtensions { public static int CalculateDistanceBetween(this Duration first, Duration last) { //Do something here } } 

所有的答案都很好,但他们正在讨论将扩展方法添加到特定types的枚举

如果您想要将方法添加到所有枚举中,例如返回当前值的整型而不是显式投射

 public static class EnumExtentions { public static int ToInt<T>(this T soure) where T : IConvertible//enum { if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type"); return (int) (IConvertible) soure; } //ShawnFeatherly funtion (above answer) but as extention method public static int Count<T>(this T soure) where T : IConvertible//enum { if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type"); return Enum.GetNames(typeof(T)).Length; } } 

IConvertible背后的诀窍是它的inheritance层次结构见MDSN

感谢ShawnFeatherly的回答

请参阅MSDN 。

 public static class Extensions { public static void SomeMethod(this Duration enumValue) { //Do something here } }