Guest User

Untitled

a guest
Jun 21st, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. private T ConvertEnum<T>(int i) where T : struct, IConvertible
  2. {
  3. return (T)i;
  4. }
  5.  
  6. private int? TryParseInt(string value)
  7. {
  8. var i = 0;
  9. if (!int.TryParse(value, out i))
  10. {
  11. return null;
  12. }
  13. return i;
  14. }
  15.  
  16. private T? TryParseEnum<T>(string value) where T : struct, IConvertible
  17. {
  18. var i = TryParseInt(value);
  19. if (!i.HasValue)
  20. {
  21. return null;
  22. }
  23.  
  24. return (T)i.Value;
  25. }
  26.  
  27. return (T)(object)i.Value;
  28.  
  29. void Main()
  30. {
  31. Console.WriteLine("Cast (reference): {0}", (TestEnum)5);
  32. Console.WriteLine("EnumConverter: {0}", EnumConverter<TestEnum>.Convert(5));
  33. Console.WriteLine("Enum.ToObject: {0}", Enum.ToObject(typeof(TestEnum), 5));
  34.  
  35. int iterations = 1000 * 1000 * 100;
  36. Measure(iterations, "Cast (reference)", () => { var t = (TestEnum)5; });
  37. Measure(iterations, "EnumConverter", () => EnumConverter<TestEnum>.Convert(5));
  38. Measure(iterations, "Enum.ToObject", () => Enum.ToObject(typeof(TestEnum), 5));
  39. }
  40.  
  41. static class EnumConverter<TEnum> where TEnum : struct, IConvertible
  42. {
  43. public static readonly Func<long, TEnum> Convert = GenerateConverter();
  44.  
  45. static Func<long, TEnum> GenerateConverter()
  46. {
  47. var parameter = Expression.Parameter(typeof(long));
  48. var dynamicMethod = Expression.Lambda<Func<long, TEnum>>(
  49. Expression.Convert(parameter, typeof(TEnum)),
  50. parameter);
  51. return dynamicMethod.Compile();
  52. }
  53. }
  54.  
  55. enum TestEnum
  56. {
  57. Value = 5
  58. }
  59.  
  60. static void Measure(int repetitions, string what, Action action)
  61. {
  62. action();
  63.  
  64. var total = Stopwatch.StartNew();
  65. for (int i = 0; i < repetitions; i++)
  66. {
  67. action();
  68. }
  69. Console.WriteLine("{0}: {1}", what, total.Elapsed);
  70. }
  71.  
  72. Cast (reference): Value
  73. EnumConverter: Value
  74. Enum.ToObject: Value
  75. Cast (reference): 00:00:00.3175615
  76. EnumConverter: 00:00:00.4335949
  77. Enum.ToObject: 00:00:14.3396366
  78.  
  79. return (T)Enum.Parse(typeof(T), i.Value.ToString(), true);
  80.  
  81. public static class Extensions
  82. {
  83. public static T ToEnum<T>(this int param)
  84. {
  85. var info = typeof(T);
  86. if (info.IsEnum)
  87. {
  88. T result = (T)Enum.Parse(typeof(T), param.ToString(), true);
  89. return result;
  90. }
  91.  
  92. return default(T);
  93. }
  94. }
  95.  
  96. Enum.ToObject
Add Comment
Please, Sign In to add comment