Передайте enum в метод, который будет использоваться в качестве enum и type - PullRequest
0 голосов
/ 04 апреля 2011

Я пытаюсь передать Enum в метод, который создаст столбцы для вида сетки. Я могу передать Enum как Enum passEnum ИЛИ Тип enumType, и любой из них работает, только не вместе. Я имею в виду, что если я передаю его как тип, метод Enum.GetNames () принимает его, а если я передаю его как enum, метод StringEnum.GetString () принимает его. Но я не могу передать один, и они оба принимают его, и я не могу передать их отдельно (перечисление и тип), и оба принимают это. Метод, которым работает 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 () получает строковое значение, прикрепленное к перечислению. Требуется перечисление для него. Как я могу заставить это работать в методе?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Я обошел проблему, написав новый метод для класса 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 и "enumType", как написано в коде Майка.Enum, по-видимому, не считается 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;
        }

Если кто-нибудь знает способ, подобный способу Майка (который использует дженерики), что я могу сделать это, я 'Буду признателен за это. Это все вопрос обучения и знаний сейчас, потому что я уже реализовал решение, которое у меня есть выше, но я все еще хотел бы знать, как сделать это в действительно обобщенном виде.c способом ... спасибо!

0 голосов
/ 04 апреля 2011

Похоже, вы пытаетесь написать универсальный метод там, без использования обобщенных, попробуйте что-то вроде этого:

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++;
    }
}

Это не совсем то, как я бы делал это с нуля, но это должно работать.

edit: Извините, я забыл показать пример вызова, который будет выглядеть так:

AddColumnsToGridView<MyEnumType>(gridView);

edit 2: Я упоминал в комментарии ниже, что у вас будут проблемы, если enum не начинается с 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, поэтому я сам не скомпилировал его, но думаю, что все должно быть в порядке. Дайте мне знать, если это все еще проблема.

...