В C # или VB.NET, под WinForms, у меня есть свойство, которое возвращает массив перечисления.См. Пример:
public enum TestEnum: int {
Name1 = 0,
Name2 = 1,
Name3 = 2
} // Note that the enum does not apply for the [Flags] attribute.
public TestEnum[] TestProperty {get; set;} =
new[] {TestEnum.Name1, TestEnum.Name2, TestEnum.Name3};
По умолчанию PropertyGrid будет показывать значения как int [], например: {0, 1, 2} вместо имен значений перечисления, например: {"Name1", "Name2", "Name2"}, то есть визуальное представление, которое я хотел бы получить ...
Итак, я хотел бы создать TypeConverter который мог бы вернуть массив строк с именами значений и применить его следующим образом:
[TypeConverter(typeof(EnumArrayToStringArrayTypeConverter))]
public TestEnum[] TestProperty {get; set;} =
new[] {TestEnum.Name1, TestEnum.Name2, TestEnum.Name3};
Другими словами, если мое свойство представлено в PropertyGrid следующим образом:
Я хотел бы иметь это:
Самая большая проблема, которую ясталкиваюсь с попыткой получить тип перечисления из пользовательского класса преобразователя типов, чтобы иметь возможность получить имена значений этого перечисления.Я могу получить только примитивный тип данных массива (например, int [], uint16 [] и т. Д.) ...
public class EnumArrayToStringArrayTypeConverter : TypeConverter {
// ...
public override object ConvertTo(ITypeDescriptorContext context,
CultureInfo culture,
object value,
Type destinationType) {
if (destinationType == null) {
throw new ArgumentNullException(nameof(destinationType));
}
try {
// This will return the array-type for the
// primitive data type of the declared enum,
// such as int[], uint16[], etc.
Type t = value.GetType();
// I'm stuck at this point.
// ...
} catch (Exception ex) {
}
return null;
}
// ...
}
Пожалуйста, примите во внимание, что я запрашиваюмногоразовое решение, которое может работать для любого типа enum.И мое перечисление в этом примере не имеет примененного атрибута [Flags], но решение должно позаботиться о том, чтобы перечисления имели его, поэтому, если элемент перечисления в массиве перечисления имеет перечисление с различными флагами, эти флаги (значениеимена) следует объединить, например, используя string.join () .