0

グリッドビューの列を作成するメソッドに Enum を渡そうとしています。Enum を Enum passEnum または Type enumType として渡すことができますが、どちらも機能しますが、一緒には機能しません。つまり、型として渡すと Enum.GetNames() メソッドがそれを受け入れ、列挙型として渡すと StringEnum.GetString() メソッドがそれを受け入れます。しかし、1つを渡して両方に受け入れさせることはできず、それらを別々に(列挙型と型)渡して両方に受け入れさせることはできません。AMOST が機能する方法:

public static void AddColumnsToGridView(GridView gv, Enum passEnum, Type enumType)
{
    BoundField bf = new BoundField();
    int c = 0;
    foreach (string item in Enum.GetNames(enumType))
    {
        bf = new BoundField();
        bf.HeaderText = StringEnum.GetString((passEnum)c);
        bf.DataField = item;
        bf.ItemStyle.CssClass = "siteFont leftPaddingThree";
        bf.SortExpression = item;
        gv.Columns.Add(bf);
        c++;
    }
}

passEnum の下に、「型または名前空間 'passEnum' が見つかりません... など」という赤い波線が表示されます。何らかの理由で、これを次のようなメソッドの外で機能させることができます。

BoundField bf = new BoundField();
int c = 0;
foreach (string item in Enum.GetNames(typeof(PatientRX)))
{
    bf = new BoundField();
    bf.HeaderText = StringEnum.GetString((PatientRX)c);
    bf.DataField = item;
    bf.ItemStyle.CssClass = "siteFont leftPaddingThree";
    bf.SortExpression = item;
    gvRX.Columns.Add(bf);
    c++;
}

StringEnum.GetString() メソッドは、列挙型に関連付けられた文字列値を取得します。列挙型を渡す必要があります。これをメソッドで機能させるにはどうすればよいですか?

4

2 に答える 2

0

各文字列を個別にプルしようとするのではなく、列挙型の文字列値のリストを返す StringEnum クラスの新しいメソッドを作成することで、問題を回避しました...次のように:

       public static void AddColumnsToGridView(GridView gv, Type enumType)
       {
           gv.Columns.Clear();
           List<string> headers = StringEnum.GetStringValueList(enumType);
           BoundField bf = new BoundField();
           int c = 0;
           foreach (string item in Enum.GetNames(enumType))
           {
              bf = new BoundField();
              bf.HeaderText = headers[c];
              bf.DataField = item;
              bf.ItemStyle.CssClass = "siteFont leftPaddingThree";
              bf.SortExpression = item;
              gv.Columns.Add(bf);
              c++;
            }
        }

マイクが投稿したように、ジェネリックを使用することをお勧めします...しかし、行にはまだ問題があります:

bf.HeaderText = StringEnum.GetString((TEnum)c);

それが呼び出すメソッドには Enum が必要であり、Mike のコードに記述されている「enumType」は明らかに Enum とは見なされません。「TEnum から System.Enum に変換できません。呼び出すメソッドは次のとおりです」というエラーが表示されるためです。

        public static string GetString(Enum value)
        {
            string output = null;
            Type type = value.GetType();

            if (_stringValues.ContainsKey(value))
                output = (_stringValues[value] as StringValueAttribute).Value;
            else
            {
                //Look for our 'StringValueAttribute' in the field's custom attributes
                FieldInfo fi = type.GetField(value.ToString());
                StringValueAttribute[] attrs = fi.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
                if (attrs.Length > 0)
                {
                    _stringValues.Add(value, attrs[0]);
                    output = attrs[0].Value;
                }
            }
            return output;
        }

上記のメソッド (または StringEnum クラス) は作成しませんでしたが、列挙型文字列のリストを取得するために追加したメソッドを次に示します。

        public static List<string> GetStringValueList(Type enumType)
        {
            List<string> values = new List<string>();
            //Look for our string value associated with fields in this enum
            foreach (FieldInfo fi in enumType.GetFields())
            {
                //Check for our custom attribute
                var stringValueAttributes = fi.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
                if (stringValueAttributes.Length > 0)
                {
                    values.Add(stringValueAttributes[0].Value);
                }
            }
            return values;
        }

Mike のような (ジェネリックを使用する) 方法を誰かが知っていれば、私はこれを成し遂げることができます。上記のソリューションを既に実装しているので、今はすべて学習と知識の問題ですが、本当に一般的な方法でこれを行う方法を知りたいです...ありがとう!

于 2011-04-06T12:12:29.773 に答える
0

実際にジェネリックを使用せずに、ジェネリックメソッドを記述しようとしているようです。次のようにしてください。

public static void AddColumnsToGridView<TEnum>(GridView gv)
{
    Type enumType = typeof(TEnum);
    BoundField bf = new BoundField();
    int c = 0;
    foreach (string item in Enum.GetNames(enumType))
    {
        bf = new BoundField();
        bf.HeaderText = StringEnum.GetString((Enum)c);
        bf.DataField = item;
        bf.ItemStyle.CssClass = "siteFont leftPaddingThree";
        bf.SortExpression = item;
        gv.Columns.Add(bf);
        c++;
    }
}

それは私が最初からやろうとしている方法ではありませんが、うまくいくはずです。

編集:申し訳ありませんが、それを呼び出す例を示すのを忘れていました。これは次のようになります。

AddColumnsToGridView<MyEnumType>(gridView);

編集 2: 以下のコメントで、列挙型が 0 で始まらない場合や値が欠落している場合に問題が発生することを述べました。代わりにこれを試してみてください:

public static void AddColumnsToGridView(GridView gv, Type enumType)
{
    Array values = Enum.GetValues(enumType)
    string[] names= Enum.GetNames(enumType)

    BoundField bf = new BoundField();
    for (int i = 0; i < names.Length; i++)
    {
        bf = new BoundField();
        bf.HeaderText = StringEnum.GetString((Enum)values.GetValue(i));
        bf.DataField = names[i];
        bf.ItemStyle.CssClass = "siteFont leftPaddingThree";
        bf.SortExpression = names[i];
        gv.Columns.Add(bf);
    }
}

これはもはやジェネリック メソッドではないことに注意してください。必要がないためです (この方法の方が優れています。実行時に列挙型ごとに JITted されたメソッドの複数のバージョンを取得することはありません)。次のように呼び出します。

AddColumnsToGridView(gridView, typeof(MyEnum));

StringEnum のコードを明らかに持っていないので、これを自分でコンパイルしていませんが、問題ないと思います。それでも問題が解決しない場合はお知らせください。

于 2011-04-04T14:55:39.527 に答える