8

この質問の続きとして。

関数を呼び出して Enum を渡すにはどうすればよいですか?

たとえば、次のコードがあります。

enum e1
{
    //...
}

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

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

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

}

これを行うと、「e1」は「タイプ」ですが、「変数」エラーメッセージのように使用されます。役立つアイデアはありますか?

特定の型だけでなく、任意の Enum で機能するように関数の汎用性を維持しようとしていますか? これは可能ですか?...ジェネリック関数を使用するのはどうですか? これは機能しますか?

4

4 に答える 4

9

汎用関数を使用できます。

    public void myFunc<T>()
    {
        var names = Enum.GetNames(typeof(T));

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

そして次のように呼び出します:

    myFunc<e1>();

(編集)

またはに制約しようとすると、コンパイラは文句を言いTます。Enumenum

したがって、型の安全性を確保するために、関数を次のように変更できます。

    public static void myFunc<T>()
    {
        Type t = typeof(T);
        if (!t.IsEnum)
            throw new InvalidOperationException("Type is not Enum");

        var names = Enum.GetNames(t);
        foreach (var name in names)
        {
            // do something!
        }
    }
于 2009-02-03T15:16:56.720 に答える
9

タイプを渡さないのはなぜですか?お気に入り:

 myfunc(typeof(e1));

public void myFunc( Type t )
{
}
于 2009-02-03T15:02:37.340 に答える
5

列挙型の型をその型のインスタンスとして渡そうとしています - 次のようなことを試してください:

enum e1
{
    foo, bar
}

public void test()
{
    myFunc(e1.foo); // this needs to be e1.foo or e1.bar - not e1 itself
}

public void myFunc(Enum e)
{
    foreach (string item in Enum.GetNames(e.GetType()))
    {
        // Print values
    }
}
于 2009-02-03T15:01:03.117 に答える
0

使用する

public void myFunc( e1 e ) { // use enum of type e}

それ以外の

public void myFunc( Enum e ) { // use type enum. The same as class or interface. This is not generic! }
于 2009-02-03T15:06:04.463 に答える