158

私はこの列挙型コードを持っています:

enum Duration { Day, Week, Month };

この Enum に拡張メソッドを追加できますか?

4

8 に答える 8

144

このサイトによると:

拡張メソッドは、チームの他のメンバーが実際に発見して使用する方法で、既存のクラスのメソッドを作成する方法を提供します。列挙型が他のクラスと同じであることを考えると、次のように拡張できることは驚くべきことではありません。

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 を参照してください。

于 2013-03-13T14:29:12.907 に答える
69

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 とは異なる型であるためのみ機能します。

于 2016-10-16T21:43:54.437 に答える
40

すべての答えは素晴らしいですが、特定の種類の列挙型に拡張メソッドを追加することについて話しています。

明示的なキャストではなく、現在の値の 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 の回答に感謝します

于 2016-11-01T10:50:30.280 に答える
8

何でも拡張機能を作成できますobject(ベスト プラクティスとは見なされませんが)。拡張メソッドをメソッドとして理解しpublic staticます。メソッドでは、任意のパラメーター タイプを使用できます。

public static class DurationExtensions
{
  public static int CalculateDistanceBetween(this Duration first, Duration last)
  {
    //Do something here
  }
}
于 2013-03-13T14:32:03.307 に答える
5

MSDNを参照してください。

public static class Extensions
{
  public static string SomeMethod(this Duration enumValue)
  {
    //Do something here
    return enumValue.ToString("D"); 
  }
}
于 2013-03-13T14:29:04.733 に答える