Пример #1
0
        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);
        }
Пример #2
0
 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);
 }
Пример #4
0
 private FieldBuilder CreateBindingField(IAmBindingDescription propertyDesc) =>
 typeBuilder.DefineField("b" + propertyDesc.Property.Name, propertyDesc.MakeBindingType(amClass),
                         FieldAttributes.Private | FieldAttributes.InitOnly);
Пример #5
0
 public FieldBuilder GetOrAddBindingField(IAmBindingDescription propertyDesc) =>
 bindings.GetOrAdd(propertyDesc, CreateBindingField);
Пример #6
0
 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);
     }
 }