private void CreateProperty(TypeBuilder typeBuilder, PropertyInfo interfaceProperty)
{
var propertyName = interfaceProperty.Name;
var field = typeBuilder.DefineField(
propertyName,
interfaceProperty.PropertyType,
FieldAttributes.Private);
var property = typeBuilder.DefineProperty(
propertyName,
PropertyAttributes.None,
interfaceProperty.PropertyType,
new[] { interfaceProperty.PropertyType });
var getMethodBuilder = typeBuilder.DefineMethod(
"get_value",
DuckMethodAttributes,
interfaceProperty.PropertyType,
Type.EmptyTypes);
var getGenerator = getMethodBuilder.GetILGenerator();
getGenerator.Emit(OpCodes.Ldarg_0);
getGenerator.Emit(OpCodes.Ldfld, field);
getGenerator.Emit(OpCodes.Ret);
var setMethodBuilder = typeBuilder.DefineMethod(
"set_value",
DuckMethodAttributes,
null,
new[] { interfaceProperty.PropertyType });
var setGenerator = setMethodBuilder.GetILGenerator();
setGenerator.Emit(OpCodes.Ldarg_0);
setGenerator.Emit(OpCodes.Ldarg_1);
setGenerator.Emit(OpCodes.Stfld, field);
setGenerator.Emit(OpCodes.Ret);
property.SetGetMethod(getMethodBuilder);
property.SetSetMethod(setMethodBuilder);
typeBuilder.DefineMethodOverride(getMethodBuilder, interfaceProperty.GetGetMethod());
typeBuilder.DefineMethodOverride(setMethodBuilder, interfaceProperty.GetSetMethod());
}
}