He aquí una solución muy rápida que abusa del hecho que el tiempo de ejecución crea múltiples instancias de clases genéricas estáticas. ¡Desata tus demonios de optimización interna!
Esto realmente brilla cuando estás leyendo Enums de una secuencia de una manera genérica. Combínelo con una clase externa que también almacena en caché el tipo subyacente de la enumeración y un BitConverter para liberar lo increíble.
void Main()
{
Console.WriteLine("Cast (reference): {0}", (TestEnum)5);
Console.WriteLine("EnumConverter: {0}", EnumConverter<TestEnum>.Convert(5));
Console.WriteLine("Enum.ToObject: {0}", Enum.ToObject(typeof(TestEnum), 5));
int iterations = 1000 * 1000 * 100;
Measure(iterations, "Cast (reference)",() => { var t = (TestEnum)5; });
Measure(iterations, "EnumConverter",() => EnumConverter<TestEnum>.Convert(5));
Measure(iterations, "Enum.ToObject",() => Enum.ToObject(typeof(TestEnum), 5));
}
static class EnumConverter<TEnum> where TEnum : struct, IConvertible
{
public static readonly Func<long, TEnum> Convert = GenerateConverter();
static Func<long, TEnum> GenerateConverter()
{
var parameter = Expression.Parameter(typeof(long));
var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
Expression.Convert(parameter, typeof(TEnum)),
parameter);
return dynamicMethod.Compile();
}
}
enum TestEnum
{
Value = 5
}
static void Measure(int repetitions, string what, Action action)
{
action();
var total = Stopwatch.StartNew();
for (int i = 0; i < repetitions; i++)
{
action();
}
Console.WriteLine("{0}: {1}", what, total.Elapsed);
}
Resultados de Core i7-3740QM con optimizaciones habilitadas:
Cast (reference): Value
EnumConverter: Value
Enum.ToObject: Value
Cast (reference): 00:00:00.3175615
EnumConverter: 00:00:00.4335949
Enum.ToObject: 00:00:14.3396366
http://stackoverflow.com/questions/2745320/enum-tryparse-with-flags-attribute - podrían ayudar ? – Sunny
Última respuesta en http://stackoverflow.com/questions/1331739/enum-type-constraints-inc-c-sharp, está más cerca de lo que desea. Todavía no es inteligente. Tiendo a usar el reflejo para esto, puedes hacer que el código sea mucho más fuerte. Struct no es lo suficientemente retrictivo como para molestar a los genéricos en mi opinión. –
Algo que no encajona: [c-sharp-no-boxing-conversion-of-generic-enum-to-int] (http://stackoverflow.com/questions/1189144/c-sharp-non-boxing- conversion-of-generic-enum-to-int) – nawfal