Мне нужно распечатать значения enum и их соответствующие значения для подделки из определенных типов, которые я узнаю через отражение. Это прекрасно работает большую часть времени.
Однако, если перечисление объявлено в родовом типе, Enum.GetValues
выдает следующее исключение:
[System.NotSupportedException: Cannot create arrays of open type. ]
at System.Array.InternalCreate(Void* elementType, Int32 rank, Int32* pLengths, Int32* pLowerBounds)
at System.Array.CreateInstance(Type elementType, Int32 length)
at System.Array.UnsafeCreateInstance(Type elementType, Int32 length)
at System.RuntimeType.GetEnumValues()
Полный код для воспроизведения:
using System;
public class Program
{
public static void Main()
{
var enumType= typeof(Foo<>.Bar);
var underlyingType = Enum.GetUnderlyingType(enumType);
Console.WriteLine(enumType.IsEnum);
foreach(var value in Enum.GetValues(enumType))
{
Console.WriteLine("{0} = {1}", value, Convert.ChangeType(value, underlyingType));
}
}
}
public class Foo<T>
{
public enum Bar
{
A = 1,
B = 2
}
}
Или протестируйте его здесь
Является ли это желаемым поведением и как я могу работать arround?
Построение типа будет рабочим, но неприемлемым для меня, поскольку оно будет слишком сложным.