public static void DefineExplicitAutoProperty(this TypeBuilder typeBuilder, Type type, PropertyInfo property) { if (property.DeclaringType == null || !property.DeclaringType.IsInterface) { throw new ArgumentException(nameof(property)); } MethodAttributes methodAttributes = MethodAttributes.Private | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final; //string prefix = property.DeclaringType.FullName + "."; string prefix = property.DeclaringType.GetFullName() + "."; string fieldName = "<" + prefix + property.Name + ">k__BackingField"; FieldBuilder fieldBuilder = typeBuilder.DefineField(fieldName, property.PropertyType, FieldAttributes.Private); fieldBuilder.SetCustomAttribute(() => new CompilerGeneratedAttribute()); PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(prefix + property.Name, PropertyAttributes.None, property.PropertyType, Type.EmptyTypes); if (property.CanRead) { MethodBuilder propertyGet = typeBuilder.DefineMethod(prefix + "get_" + property.Name, methodAttributes, property.PropertyType, Type.EmptyTypes); propertyGet.SetCustomAttribute(() => new CompilerGeneratedAttribute()); ILGenerator iLGenerator = propertyGet.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldfld, fieldBuilder); iLGenerator.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(propertyGet, property.GetMethod); propertyBuilder.SetGetMethod(propertyGet); } if (property.CanWrite) { MethodBuilder propertySet = typeBuilder.DefineMethod(prefix + "set_" + property.Name, methodAttributes, typeof(void), new Type[] { property.PropertyType }); propertySet.SetCustomAttribute(() => new CompilerGeneratedAttribute()); propertySet.DefineParameter(1, ParameterAttributes.None, "value"); ILGenerator iLGenerator = propertySet.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Stfld, fieldBuilder); iLGenerator.Emit(OpCodes.Ret); typeBuilder.DefineMethodOverride(propertySet, property.SetMethod); propertyBuilder.SetSetMethod(propertySet); } propertyBuilder.CopyCustomAttributes(property); }
public static void DefineAutoProperty(this TypeBuilder typeBuilder, Type type, PropertyInfo property) { MethodAttributes methodAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final; string fieldName = "<" + property.Name + ">k__BackingField"; FieldBuilder fieldBuilder = typeBuilder.DefineField(fieldName, property.PropertyType, FieldAttributes.Private); fieldBuilder.SetCustomAttribute(() => new CompilerGeneratedAttribute()); PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(property.Name, PropertyAttributes.None, property.PropertyType, Type.EmptyTypes); if (property.CanRead) { MethodBuilder propertyGet = typeBuilder.DefineMethod("get_" + property.Name, methodAttributes, property.PropertyType, Type.EmptyTypes); propertyGet.SetCustomAttribute(() => new CompilerGeneratedAttribute()); ILGenerator iLGenerator = propertyGet.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldfld, fieldBuilder); iLGenerator.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(propertyGet); } if (property.CanWrite) { MethodBuilder propertySet = typeBuilder.DefineMethod("set_" + property.Name, methodAttributes, typeof(void), new Type[] { property.PropertyType }); propertySet.SetCustomAttribute(() => new CompilerGeneratedAttribute()); propertySet.DefineParameter(1, ParameterAttributes.None, "value"); ILGenerator iLGenerator = propertySet.GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Ldarg_1); iLGenerator.Emit(OpCodes.Stfld, fieldBuilder); iLGenerator.Emit(OpCodes.Ret); propertyBuilder.SetSetMethod(propertySet); } propertyBuilder.CopyCustomAttributes(property); }