web-dev-qa-db-ja.com

関数パラメーターとしてC#列挙型?

標準のc#列挙型をパラメーターとして渡すことはできますか?

例えば:

enum e1
{
    //...
}

enum e2
{
    //...
}

public void test()
{
    myFunc( e1 );
    myFunc( e2 );
}

public void myFunc( Enum e )
{
    // Iterate through all the values in e
}

これを行うことで、任意の列挙型内のすべての名前を取得したいと思います。反復コードはどのようになりますか?

19
TK.

この!

        public void Foo(Enum e)
        {
            var names = Enum.GetNames(e.GetType());

            foreach (var name in names)
            {
                // do something!
            }
        }   

編集:私の悪い、あなたしました言う反復

注:foreachステートメントでGetNames()呼び出しを実行できることはわかっていますが、デバッグに便利なため、最初にそのタイプのものをメソッド呼び出しに割り当てることをお勧めします。

28
Daniel Schaffer

Enum.GetNames(typeof(e))メソッドを使用します。これにより、名前を含む文字列の配列が返されます。

Enum.GetValuesを使用して、対応する値を取得することもできます。

編集-フープ-パラメータを列挙型として渡す場合は、実際の列挙型名としてパラメータを渡した場合に使用するtypeof()の代わりにe.GetType()を使用する必要があります。

3

Enum.GetNamesのような意味ですか?

3
ctacke

Enum.GetValues Enum.GetNames

だから...

foreach(e1 value in Enum.GetValues(typeof(e1)))
3
Luke

次の例のように、enummyFuncに直接渡そうとすると、問題が発生します。

enum e1 {something, other};
myFunc(e1);  // Syntax error: "e1 is a type, but is being used like a variable"
3
gg89

このような:

    public void myFunc(Enum e)
    {
        foreach (var name in Enum.GetNames(typeof(e)))
        {
            Console.WriteLine(name);
        }
    }
2
bruno conde

正しいのは:

public void myFunc(Enum e)
{
    foreach (var name in Enum.GetNames(e.GetTye()))
    {
        Console.WriteLine(name);
    }
}
1
bgruen