web-dev-qa-db-ja.com

C#のenum内のメソッド

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

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

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

129
Eya

次のように書くことができます 拡張メソッド 列挙型の場合:

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();
    }
}
225
MarkPflug
18
Jay Riggs

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

基本的に、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}!";
    }
}

次に、enumのようにそれを使用できます(その中にメソッドを配置する可能性があります)。

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

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

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

9

いや。クラスを作成し、クラスに一連のプロパティを追加してsomewhat enumをエミュレートできますが、それは実際には同じではないです。

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.
    }
}

より良いパターンは、emumとは別のクラスにメソッドを配置することです。

3
Kyle Trauberman

私が出会い、列挙型と文字列の正反対が必要だったので、ここに一般的な解決策があります:

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

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

0
scrat84