1: static void Main()
2: {
3: var property = typeof(IFoo).GetProperty("Bar");
4: var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Artech.EmitVsExpression"), AssemblyBuilderAccess.RunAndSave);
5: var moduleBuilder = assemblyBuilder.DefineDynamicModule("Artech.EmitVsExpression", "Artech.EmitVsExpression.dll");
6: var typeBuilder = moduleBuilder.DefineType("Program");
7:
8: //GetPropertyValueViaExpression
9: var methodBuilder = typeBuilder.DefineMethod("GetPropertyValueViaExpression", MethodAttributes.Static | MethodAttributes.Public, typeof(Bar), new Type[] { typeof(IFoo) });
10: var target = Expression.Parameter(typeof(IFoo));
11: var getPropertyValue = Expression.Property(target, property);
12: Expression.Lambda<Func<IFoo, Bar>>(getPropertyValue, target).CompileToMethod(methodBuilder);
13:
14: //SetPropertyValueViaExpression
15: methodBuilder = typeBuilder.DefineMethod("SetPropertyValueViaExpression", MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(IFoo), typeof(Bar) });
16: target = Expression.Parameter(typeof(IFoo));
17: var propertyValue = Expression.Parameter(typeof(Bar));
18: var setPropertyValue = Expression.Call(target, property.GetSetMethod(), propertyValue);
19: Expression.Lambda<Action<IFoo, Bar>>(setPropertyValue, target, propertyValue).CompileToMethod(methodBuilder);
20:
21: //GetPropertyValueViaEmit
22: methodBuilder = typeBuilder.DefineMethod("GetPropertyValueViaEmit", MethodAttributes.Static| MethodAttributes.Public, typeof(Bar), new Type[] { typeof(IFoo) });
23: ILGenerator ilGenerator = methodBuilder.GetILGenerator();
24: ilGenerator.Emit(OpCodes.Ldarg_0);
25: ilGenerator.EmitCall(OpCodes.Callvirt, property.GetGetMethod(), null);
26: ilGenerator.Emit(OpCodes.Ret);
27:
28: //SetPropertyValueViaEmit
29: methodBuilder = typeBuilder.DefineMethod("SetPropertyValueViaEmit", MethodAttributes.Static | MethodAttributes.Public, typeof(void), new Type[] { typeof(IFoo), typeof(Bar) });
30: ilGenerator = methodBuilder.GetILGenerator();
31: ilGenerator.Emit(OpCodes.Ldarg_0);
32: ilGenerator.Emit(OpCodes.Ldarg_1);
33: ilGenerator.EmitCall(OpCodes.Callvirt, property.GetSetMethod(), null);
34: ilGenerator.Emit(OpCodes.Ret);
35:
36: typeBuilder.CreateType();
37: assemblyBuilder.Save("Artech.EmitVsExpression.dll");
38: }