Я обошел проблему, написав новый метод для класса 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 способом ... спасибо!