private void UseExplicitImplementationForHandlerMethod(MethodMetadata handlerMethod)
 {
     if (handlerMethod != null)
     {
         handlerMethod.UseExplicitInterfaceImplementation();
     }
 }
 public DuckTypePropertyMetadata(
     PropertyInfo property, 
     PropertyInfo targetProperty,
     MethodMetadata getMethod, 
     MethodMetadata setMethod)
     : base(property, getMethod, setMethod)
 {
     _targetProperty = targetProperty;
 }
 public NonTargetedMethodGenerator(
     MethodMetadata methodMetadata,
     FieldBuilder dispatcherField,
     FieldBuilder methodInfoField)
 {
     _methodMetadata = methodMetadata;
     _dispatcherField = dispatcherField;
     _methodInfoField = methodInfoField;
 }
 public DuckTypeEventMetadata(
     EventInfo @event, 
     EventInfo targetEvent,
     MethodMetadata addHandlerMethod, 
     MethodMetadata removeHandlerMethod, 
     MethodMetadata raiseHandlerMethod)
     : base(@event, addHandlerMethod, removeHandlerMethod, raiseHandlerMethod)
 {
     _targetEvent = targetEvent;
 }
        public EventMetadata(
             EventInfo eventInfo,
            MethodMetadata addHandlerMethod,
            MethodMetadata removeHandlerMethod,
            MethodMetadata raiseHandlerMethod)
            : base(eventInfo)
        {
            _eventInfo = eventInfo;
            _addHandlerMethod = addHandlerMethod;
            _removeHandlerMethod = removeHandlerMethod;
            _raiseHandlerMethod = raiseHandlerMethod;

            _eventAttributes = _eventInfo.Attributes;
        }
        public PropertyMetadata(
            PropertyInfo propertyInfo, 
            MethodMetadata getMethod, 
            MethodMetadata setMethod)
            : base(propertyInfo)
        {
            _propertyInfo = propertyInfo;

            _getMethod = getMethod;
            _setMethod = setMethod;

            _indexerTypes = GetIndexerTypes(_propertyInfo);

            _propertyAttributes = propertyInfo.Attributes;
        }
 public TypeMetadata(
     string name,
     Type baseType,
     Type[] interfaces,
      DispatcherFieldMetadata dispatcherField,
     FieldMetadata[] fields,
     ConstructorMetadata[] constructors, 
     MethodMetadata[] methods, 
     PropertyMetadata[] properties, 
     EventMetadata[] events, 
     TargetMetadata[] targets)
 {
     _name = name;
     _baseType = baseType;
     _interfaces = interfaces;
     _dispatcherField = dispatcherField;
     _fields = fields;
     _constructors = constructors;
     _methods = methods;
     _properties = properties;
     _events = events;
     _targets = targets;
 }
        protected static MethodBuilder GenerateMethod(
            TypeBuilder typeBuilder,
            MethodMetadata methodMetadata,
            FieldBuilder dispatcherField,
            FieldBuilder methodInfoField,
            MethodInfo targetMethod)
        {
            var method = methodMetadata.Method;

            var parameters = method.GetParameters();
            var parameterCount = parameters.Length;

            var methodBuilder = typeBuilder.DefineMethod(
                methodMetadata.Name,
                methodMetadata.MethodAttributes,
                methodMetadata.ReturnType,
                methodMetadata.ParameterTypes);

            if (method.IsGenericMethodDefinition)
            {
                CloneGenericMethodArguments(method, methodBuilder);
            }

            for (var i = 0; i < parameterCount; i++)
            {
                methodBuilder.DefineParameter(i + 1, parameters[i].Attributes, parameters[i].Name);
            }

            var il = methodBuilder.GetILGenerator();

            var args = il.DeclareLocal(typeof(object[]));

            LocalBuilder returnValue = null;

            if (method.ReturnType != typeof(void))
            {
                returnValue = il.DeclareLocal(method.ReturnType);
            }

            new InitializeOutArgumentsStatement(parameters).Emit(il);

            new StoreLocalStatement(
                args,
                new CreateArrayExpression(typeof(object), parameterCount)
            ).Emit(il);

            new InitializeInvokerArgumentArrayStatement(args, parameters).Emit(il);

            new InvokeDispatcherMethodStatement(
                dispatcherField,
                methodInfoField,
                method,
                args,
                returnValue,
                targetMethod
            ).Emit(il);

            new StoreOutArgumentsStatement(args, parameters).Emit(il);

            if (method.ReturnType == typeof(void))
            {
                new ReturnStatement().Emit(il);
            }
            else
            {
                new ReturnStatement(new LoadLocalExpression(returnValue)).Emit(il);
            }

            return methodBuilder;
        }