0

列挙型が渡されたときに特定のマークアップを返すジェネリック メソッドを作成しようとしています。以下は、この質問に必要な最小限のコードに縮小されたメソッドです。

    public static string GetMarkup(Type enumType)
    {
        StringBuilder builder = new StringBuilder();
        foreach (var val in Enum.GetValues(enumType))
        {
            builder.Append(val.ToString());
        }
        return builder.ToString();
    }

メソッドは次のように呼び出されます。ここで、CopyType は列挙型です。

    GetDropDownListHtml(typeof(CopyType))

目標は、このメソッドに渡す列挙型用に作成した ToString() 拡張メソッドを呼び出せるようにすることです。問題は、メソッドをジェネリックにするためvarに、 foreach 宣言で変数を宣言するために使用する必要があることですが、それはそれをボックス化します。CopyType の列挙型の代わりに、ボックス化された CopyType であるオブジェクトがあります。

それに応えて、私はこのように多くのことを考えてみましたが、役に立ちませんでした:

    ((typeof(enumType))val.ToString()

何か案は?

4

1 に答える 1

0

特定の列挙型に対してこれを行うために拡張メソッドを使用する方法はありません。すべての型をサポートするように拡張メソッドを拡張するか、必要な場合にのみキャストするために使用できるステートメントをそこにEnum追加するか、この型の列挙型に対してのみ呼び出すこの関数に特別なオーバーロードを記述する必要があります。isこれは、拡張メソッドが実際にどのように実装されるかに関係しています。

コンパイラは、拡張メソッドを静的な形式に変換します。つまり、コンパイル時にmyCopyType.ToString()なります。CopyType.ToString(myCopyType)しかし、あなたのシナリオでは (またはジェネリックでも)、型は実行時まで決定されないため、コンパイラは使用する型を判断できません。

これにより、上記の 3 つの選択肢が残ります。

私自身のコードでは、コードhereに基づいて最初のオプションを使用しました。.GetLabel()任意のタイプを呼び出すことができ、Enumこのタイプに特別なラベルを付けることができます。

さらに、foreach (Enum val in ...コンパイラがEnum.

于 2013-10-24T19:31:01.443 に答える