/Urasandesu.NTroll.FormulaSample/Formulas/ExpressionToInlineValue.cs

https://github.com/urasandesu/NTroll · C# · 195 lines · 186 code · 9 blank · 0 comment · 15 complexity · 0bd3e7192c0d4d2420f06c2dee6c382a MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Linq.Expressions;
  6. using Urasandesu.NAnonym;
  7. using System.Collections.ObjectModel;
  8. using System.Reflection;
  9. namespace Urasandesu.NTroll.FormulaSample.Formulas
  10. {
  11. class ExpressionToInlineValue
  12. {
  13. protected ExpressionToInlineValue()
  14. {
  15. }
  16. public static object Convert(Expression exp)
  17. {
  18. Required.NotDefault(exp, () => exp);
  19. var state = new State();
  20. return ConvertExpression(exp, state);
  21. }
  22. static object ConvertExpression(Expression exp, State state)
  23. {
  24. switch (exp.NodeType)
  25. {
  26. case ExpressionType.Add:
  27. throw new NotImplementedException();
  28. case ExpressionType.AddChecked:
  29. throw new NotImplementedException();
  30. case ExpressionType.And:
  31. throw new NotImplementedException();
  32. case ExpressionType.AndAlso:
  33. throw new NotImplementedException();
  34. case ExpressionType.ArrayIndex:
  35. throw new NotImplementedException();
  36. case ExpressionType.ArrayLength:
  37. throw new NotImplementedException();
  38. case ExpressionType.Call:
  39. return ConvertMethodCall((MethodCallExpression)exp, state);
  40. case ExpressionType.Coalesce:
  41. throw new NotImplementedException();
  42. case ExpressionType.Conditional:
  43. throw new NotImplementedException();
  44. case ExpressionType.Constant:
  45. return ConvertConstant((ConstantExpression)exp, state);
  46. case ExpressionType.Convert:
  47. throw new NotImplementedException();
  48. case ExpressionType.ConvertChecked:
  49. throw new NotImplementedException();
  50. case ExpressionType.Divide:
  51. throw new NotImplementedException();
  52. case ExpressionType.Equal:
  53. throw new NotImplementedException();
  54. case ExpressionType.ExclusiveOr:
  55. throw new NotImplementedException();
  56. case ExpressionType.GreaterThan:
  57. throw new NotImplementedException();
  58. case ExpressionType.GreaterThanOrEqual:
  59. throw new NotImplementedException();
  60. case ExpressionType.Invoke:
  61. throw new NotImplementedException();
  62. case ExpressionType.Lambda:
  63. throw new NotImplementedException();
  64. case ExpressionType.LeftShift:
  65. throw new NotImplementedException();
  66. case ExpressionType.LessThan:
  67. throw new NotImplementedException();
  68. case ExpressionType.LessThanOrEqual:
  69. throw new NotImplementedException();
  70. case ExpressionType.ListInit:
  71. throw new NotImplementedException();
  72. case ExpressionType.MemberAccess:
  73. return ConvertMember((MemberExpression)exp, state);
  74. case ExpressionType.MemberInit:
  75. throw new NotImplementedException();
  76. case ExpressionType.Modulo:
  77. throw new NotImplementedException();
  78. case ExpressionType.Multiply:
  79. throw new NotImplementedException();
  80. case ExpressionType.MultiplyChecked:
  81. throw new NotImplementedException();
  82. case ExpressionType.Negate:
  83. throw new NotImplementedException();
  84. case ExpressionType.NegateChecked:
  85. throw new NotImplementedException();
  86. case ExpressionType.New:
  87. throw new NotImplementedException();
  88. case ExpressionType.NewArrayBounds:
  89. throw new NotImplementedException();
  90. case ExpressionType.NewArrayInit:
  91. throw new NotImplementedException();
  92. case ExpressionType.Not:
  93. throw new NotImplementedException();
  94. case ExpressionType.NotEqual:
  95. throw new NotImplementedException();
  96. case ExpressionType.Or:
  97. throw new NotImplementedException();
  98. case ExpressionType.OrElse:
  99. throw new NotImplementedException();
  100. case ExpressionType.Parameter:
  101. throw new NotImplementedException();
  102. case ExpressionType.Power:
  103. throw new NotImplementedException();
  104. case ExpressionType.Quote:
  105. throw new NotImplementedException();
  106. case ExpressionType.RightShift:
  107. throw new NotImplementedException();
  108. case ExpressionType.Subtract:
  109. throw new NotImplementedException();
  110. case ExpressionType.SubtractChecked:
  111. throw new NotImplementedException();
  112. case ExpressionType.TypeAs:
  113. throw new NotImplementedException();
  114. case ExpressionType.TypeIs:
  115. throw new NotImplementedException();
  116. case ExpressionType.UnaryPlus:
  117. throw new NotImplementedException();
  118. default:
  119. throw new NotImplementedException();
  120. }
  121. }
  122. static object ConvertMethodCall(MethodCallExpression exp, State state)
  123. {
  124. var parameter = new object[] { };
  125. if (exp.Arguments != null && 0 < exp.Arguments.Count)
  126. {
  127. parameter = (object[])ConvertArguments(exp.Arguments, state).ToArray();
  128. }
  129. if (exp.Object == null)
  130. {
  131. return exp.Method.Invoke(null, parameter);
  132. }
  133. else
  134. {
  135. return exp.Method.Invoke(ConvertExpression(exp.Object, state), parameter);
  136. }
  137. }
  138. static ReadOnlyCollection<object> ConvertArguments(ReadOnlyCollection<Expression> exps, State state)
  139. {
  140. var arguments = new List<object>();
  141. foreach (var exp in exps)
  142. {
  143. arguments.Add(ConvertExpression(exp, state));
  144. }
  145. return new ReadOnlyCollection<object>(arguments);
  146. }
  147. static object ConvertConstant(ConstantExpression exp, State state)
  148. {
  149. return exp.Value;
  150. }
  151. static object ConvertMember(MemberExpression exp, State state)
  152. {
  153. var fieldInfo = default(FieldInfo);
  154. var propertyInfo = default(PropertyInfo);
  155. if ((fieldInfo = exp.Member as FieldInfo) != null)
  156. {
  157. if (exp.Expression == null)
  158. {
  159. return fieldInfo.GetValue(null);
  160. }
  161. else
  162. {
  163. return fieldInfo.GetValue(ConvertExpression(exp.Expression, state));
  164. }
  165. }
  166. else if ((propertyInfo = exp.Member as PropertyInfo) != null)
  167. {
  168. if (exp.Expression == null)
  169. {
  170. return propertyInfo.GetValue(null, null);
  171. }
  172. else
  173. {
  174. return propertyInfo.GetValue(ConvertExpression(exp.Expression, state), null);
  175. }
  176. }
  177. else
  178. {
  179. throw new NotImplementedException();
  180. }
  181. }
  182. class State
  183. {
  184. }
  185. }
  186. }