private static void WriteProperty(Type parentType, TypeBuilder builder, string name, Type type)
{
const BindingFlags BindingFlag = BindingFlags.Public | BindingFlags.Instance;
const MethodAttributes MethodAttribute = MethodAttributes.Public | MethodAttributes.Virtual;
string getName = "get_" + name;
string setName = "set_" + name;
MethodInfo parentGetMethod = parentType.GetMethod(getName, BindingFlag);
MethodBuilder implementedGetMethod = builder.DefineMethod(getName, MethodAttribute, type, Type.EmptyTypes);
ILGenerator getIl = implementedGetMethod.GetILGenerator();
getIl.Emit(OpCodes.Ldarg_0);
getIl.Emit(OpCodes.Call, parentGetMethod);
getIl.Emit(OpCodes.Ret);
MethodInfo interfaceGetMethod = authorizeAttributeType.GetMethod(getName, BindingFlag);
builder.DefineMethodOverride(implementedGetMethod, interfaceGetMethod);
MethodInfo parentSetMethod = parentType.GetMethod(setName, BindingFlag);
MethodBuilder implementedSetMethod = builder.DefineMethod(setName, MethodAttribute, typeof(void), new[] { type });
ILGenerator setIl = implementedSetMethod.GetILGenerator();
setIl.Emit(OpCodes.Ldarg_0);
setIl.Emit(OpCodes.Ldarg_1);
setIl.Emit(OpCodes.Call, parentSetMethod);
setIl.Emit(OpCodes.Ret);
MethodInfo interfaceSetMethod = authorizeAttributeType.GetMethod(setName, BindingFlag);
builder.DefineMethodOverride(implementedSetMethod, interfaceSetMethod);
}