C#の列挙型内のメソッド


165

Javaでは、列挙内にメソッドを含めることができます。

C#でそのような可能性はありますか、それとも単なる文字列コレクションですか?

オーバーライドしようとしましたがToString()、コンパイルされません。誰かが簡単なコードサンプルを持っていますか?


C#のEnum内にメソッドを含めることはできないと思います。あなたは何をしようとしているのですか?
ダンカンハウ

Javaの動作を取得し、Enumに近いロジックをカプセル化しようとしています。とにかく私は答えから見るとそれは不可能です-私は拡張機能を実装します。
Eya、

回答:


272

列挙型の拡張メソッドを作成できます。

enum Stuff
{
    Thing1,
    Thing2
}

static class StuffMethods
{

    public static String GetString(this Stuff s1)
    {
        switch (s1)
        {
            case Stuff.Thing1:
                return "Yeah!";
            case Stuff.Thing2:
                return "Okay!";
            default:
                return "What?!";
        }
    }
}

class Program
{


    static void Main(string[] args)
    {
        Stuff thing = Stuff.Thing1;
        String str = thing.GetString();
    }
}


11

別のオプションは、Jimmy Bogardによって作成された列挙クラスを使用することです。

基本的に、彼から継承するクラスを作成する必要がありますEnumeration。例:

public class EmployeeType : Enumeration
{
    public static readonly EmployeeType Manager 
        = new EmployeeType(0, "Manager");
    public static readonly EmployeeType Servant 
        = new EmployeeType(1, "Servant");
    public static readonly EmployeeType Assistant
        = new EmployeeType(2, "Assistant to the Regional Manager");

    private EmployeeType() { }
    private EmployeeType(int value, string displayName) : base(value, displayName) { }

    // Your method...
    public override string ToString()
    {
        return $"{value} - {displayName}!";
    }
}

次に、それを列挙型のように使用することができ、その中にメソッドを置くことができます(他のものの中でも):

EmployeeType.Manager.ToString();
//0 - Manager
EmployeeType.Servant.ToString();
//1 - Servant
EmployeeType.Assistant.ToString();
//2 - Assistant to the Regional Manager

NuGetでダウンロードできます。

この実装は言語にネイティブではありませんが、構文(構築と使用法)は、C#よりもネイティブで列挙型を実装する言語(Kotlinなど)にかなり近いです。


3

いいえ。クラスを作成してから、クラスに一連のプロパティを追加して、列挙型をいくらかエミュレートできますが、実際には同じことではありません

class MyClass
{
    public string MyString1 { get{ return "one";} }
    public string MyString2 { get{ return "two";} }
    public string MyString3 { get{ return "three";} }

    public void MyMethod()
    {
        // do something.
    }
}

より良いパターンは、あなたのメソッドをあなたのエミュとは別のクラスに置くことです。


0

私が出会い、enumからstringへの正反対が必要になったので、ここにGenericソリューションがあります:

static class EnumExtensions {
    public static T GetEnum<T>(this string itemName) {
        return (T) Enum.Parse(typeof(T), itemName, true);
    }
}

これは大文字と小文字の区別も無視するため、列挙型に対するREST-Responseを解析して型の安全性を高めるのに非常に便利です。うまくいけば、それは誰かを助ける


-15

C#は、クラスベースの原則ではなく、文字列と値を持つ2次元配列であるため、列挙子でのメソッドの使用を許可しません。

この場合、Microsoftはクラスの使用をお勧めしません。代わりに(data)struct(ures)を使用してください。STRUCTは、データとそのハンドラーのライトクラスとして意図されており、関数を適切に処理できます。Javaからわかるように、C#とそのコンパイラーには追跡機能と効率機能がありません。特定のクラス/メソッドが使用される回数が多いほど、実行が速くなり、その使用が「期待」されます。C#にはそれがないので、区別するには、CLASSではなくSTRUCTを使用します。


7
この回答の何が間違っていると思われるかを説明するための単一のコメントなしの7つの反対票?C'mon guys ...
おやすみオタクプライド

この投稿で提供されているすべての情報は間違っていますか?
VK、

5
この部分は真実です:C#列挙子でのメソッドの使用を許可しません。推論が正しいかどうかはわかりませんが、2番目の段落は質問とはまったく無関係のようです。構造体を使用して動作を伴う列挙型をシミュレートする方法がある場合は、例を提供するのが最適です。
ミシェル2016年

3
ここでの意味はかなり明確だと思います。メソッドを追加するためだけに列挙型(値の型)をクラス(参照型)で置き換えないでください。構造体はメソッドを持つこともでき、値型でもあるためです。
2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.