public static void AddProperty(this TypeDef typeDef, string propertyName, TypeSig propertyType) { var fieldName = $"__{propertyName}_backingField"; var backingField = new FieldDefUser(fieldName, new FieldSig(propertyType), FieldAttributes.Private); typeDef.Fields.Add(backingField); var getterName = $"get_{propertyName}"; var setterName = $"set_{propertyName}"; const MethodAttributes attributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.NewSlot | MethodAttributes.Virtual; var module = typeDef.Module; // Implement the getter and the setter var getter = AddPropertyGetter(propertyType, getterName, attributes, backingField); var setter = AddPropertySetter(propertyType, setterName, attributes, backingField, module); typeDef.AddProperty(propertyName, propertyType, getter, setter); }