Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Reflection.Emit;
- namespace MSILCalc
- {
- class Program
- {
- private static readonly Type ReturnType = typeof(int);
- private static readonly Type[] ParameterTypes = { typeof(int), typeof(int), typeof(int), typeof(int) };
- private static Func<int, int, int, int, int> Parse(string equation)
- {
- DynamicMethod dynamicMethod = new DynamicMethod("", ReturnType, ParameterTypes);
- ILGenerator ilGenerator = dynamicMethod.GetILGenerator();
- foreach (char c in equation)
- {
- switch (c)
- {
- case 'a':
- ilGenerator.Emit(OpCodes.Ldarg_0);
- break;
- case 'b':
- ilGenerator.Emit(OpCodes.Ldarg_1);
- break;
- case 'c':
- ilGenerator.Emit(OpCodes.Ldarg_2);
- break;
- case 'd':
- ilGenerator.Emit(OpCodes.Ldarg_3);
- break;
- case '+':
- ilGenerator.Emit(OpCodes.Add);
- break;
- case '*':
- ilGenerator.Emit(OpCodes.Mul);
- break;
- }
- }
- ilGenerator.Emit(OpCodes.Ret);
- Delegate compiled = dynamicMethod.CreateDelegate(typeof(Func<int, int, int, int, int>));
- return (Func<int, int, int, int, int>)compiled;
- }
- static void Main(string[] args)
- {
- Func<int, int, int, int, int> intMethod = Parse("abcd+*+");
- int result1 = intMethod(1, 2, 3, 4);
- int result2 = intMethod(4, 3, 2, 1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement