Dưới đây là một giải pháp rất nhanh chóng lạm dụng thực tế rằng thời gian chạy tạo ra nhiều phiên bản của các lớp chung chung tĩnh. Giải phóng ma quỷ tối ưu hóa bên trong của bạn!
Điều này thực sự tỏa sáng khi bạn đang đọc Enums từ luồng theo kiểu chung. Kết hợp với một lớp bên ngoài cũng lưu trữ kiểu cơ bản của enum và một BitConverter để giải phóng tuyệt vời.
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);
}
Kết quả trên Core i7-3740QM với tối ưu hóa được kích hoạt:
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
Nguồn
2014-10-10 00:02:41
http://stackoverflow.com/questions/2745320/enum-tryparse-with-flags-attribute - có thể giúp ? – Sunny
Câu trả lời cuối cùng trên http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c-sharp, gần hơn với những gì bạn muốn. Nó vẫn không thông minh. Tôi có xu hướng sử dụng sự phản chiếu cho điều này, bạn có thể làm cho mã mạnh hơn rất nhiều. Struct không đủ để làm cho rối tung với các generics đáng giá theo ý kiến của tôi. –
Nội dung không có trong hộp: [c-sharp-không-boxing-chuyển đổi-of-generic-enum-to-int] (http://stackoverflow.com/questions/1189144/c-sharp-non-boxing- conversion-of-generic-enum-to-int) – nawfal