如何将扩展方法添加到枚举
我有这个枚举代码:
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 } }