private static void CreateMethod(AmObjectClassBuildingContext context, IAmBindingDescription bindingDesc, MethodInfo method) { var methodBuilder = context.TypeBuilder.DefineMethod(method.Name, MethodAttributes.Public | MethodAttributes.Final | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual); methodBuilder.SetParameters(method.GetParameters().Select(x => x.ParameterType).ToArray()); methodBuilder.SetReturnType(method.ReturnType); methodBuilder.SetImplementationFlags(MethodImplAttributes.Managed); var il = new CilEmitterSugar(methodBuilder.GetILGenerator()); var field = context.Fields.GetOrAddBindingField(bindingDesc); if (method.Name.StartsWith("get_")) { il.Ldarg(0); il.Ldfld(field); il.Call(bindingDesc.MakePropertyGetMethod(context.AmClass)); il.Ret(); } else if (method.Name.StartsWith("set_")) { il.Ldarg(0); il.Ldfld(field); il.Ldarg(1); il.Call(bindingDesc.MakePropertySetMethod(context.AmClass)); il.Ret(); } else { throw new Exception($"Either getter or setter expected, but '{method.Name}' found."); } context.TypeBuilder.DefineMethodOverride(methodBuilder, method); }
public bool TryCreateDescription(PropertyInfo property, out IAmBindingDescription description) { if (property.GetMethod != null && property.SetMethod != null) { description = new AmSingularBindingDescription(property); return(true); } description = null; return(false); }
public bool TryCreateDescription(PropertyInfo property, out IAmBindingDescription description) { if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(IList <>) && property.GetMethod != null && property.SetMethod == null) { description = new AmListBindingDescription(property); return(true); } description = null; return(false); }
private FieldBuilder CreateBindingField(IAmBindingDescription propertyDesc) => typeBuilder.DefineField("b" + propertyDesc.Property.Name, propertyDesc.MakeBindingType(amClass), FieldAttributes.Private | FieldAttributes.InitOnly);
public FieldBuilder GetOrAddBindingField(IAmBindingDescription propertyDesc) => bindings.GetOrAdd(propertyDesc, CreateBindingField);
private static void CreateBindingMethods(AmObjectClassBuildingContext context, IAmBindingDescription bindingDesc) { CreateMethod(context, bindingDesc, bindingDesc.Property.GetMethod); if (bindingDesc.Property.SetMethod != null) { CreateMethod(context, bindingDesc, bindingDesc.Property.SetMethod); } }