私はこの列挙型コードを持っています:
enum Duration { Day, Week, Month };
この Enum に拡張メソッドを追加できますか?
このサイトによると:
拡張メソッドは、チームの他のメンバーが実際に発見して使用する方法で、既存のクラスのメソッドを作成する方法を提供します。列挙型が他のクラスと同じであることを考えると、次のように拡張できることは驚くべきことではありません。
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");
}
}
}
列挙型は一般的に最良の選択ではないと思いますが、少なくともこれにより、switch/if 処理の一部を集中化し、より良いことができるようになるまでそれらを少し抽象化できます。値が範囲内であることも確認してください。
詳細については、こちらの Microsft MSDN を参照してください。
Enum のインスタンスではなく、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;
これは真の拡張メソッドではありません。Enum<> は System.Enum とは異なる型であるためのみ機能します。
すべての答えは素晴らしいですが、特定の種類の列挙型に拡張メソッドを追加することについて話しています。
明示的なキャストではなく、現在の値の int を返すようなメソッドをすべての列挙型に追加したい場合はどうすればよいでしょうか?
public static class EnumExtensions
{
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
は、その継承階層です。MDSNを参照してください。
ShawnFeatherly の回答に感謝します
何でも拡張機能を作成できますobject
(ベスト プラクティスとは見なされませんが)。拡張メソッドをメソッドとして理解しpublic static
ます。メソッドでは、任意のパラメーター タイプを使用できます。
public static class DurationExtensions
{
public static int CalculateDistanceBetween(this Duration first, Duration last)
{
//Do something here
}
}
MSDNを参照してください。
public static class Extensions
{
public static string SomeMethod(this Duration enumValue)
{
//Do something here
return enumValue.ToString("D");
}
}