private Reference GetDelegate(AbstractTypeEmitter invocation, MethodEmitter invokeMethodOnTarget) { var closedDelegateType = delegateType.MakeGenericType(GenericTypeParameterBuilderExtender.AsTypes(invocation.GenericTypeParams)); var localReference = invokeMethodOnTarget.CodeBuilder.DeclareLocal(closedDelegateType); var closedMethodOnTarget = method.MethodOnTarget.MakeGenericMethod(GenericTypeParameterBuilderExtender.AsTypes(invocation.GenericTypeParams)); var localTarget = new ReferenceExpression(targetReference); invokeMethodOnTarget.CodeBuilder.AddStatement( SetDelegate(localReference, localTarget, closedDelegateType, closedMethodOnTarget)); return(localReference); }
public BindDelegateExpression(Type @delegate, Expression owner, MethodInfo methodToBindTo, GenericTypeParameterBuilder[] genericTypeParams) { delegateCtor = @delegate.GetConstructors()[0]; this.methodToBindTo = methodToBindTo; if (@delegate.IsGenericTypeDefinition()) { var closedDelegate = @delegate.MakeGenericType(GenericTypeParameterBuilderExtender.AsTypes(genericTypeParams)); delegateCtor = TypeBuilder.GetConstructor(closedDelegate, delegateCtor); this.methodToBindTo = methodToBindTo.MakeGenericMethod(GenericTypeParameterBuilderExtender.AsTypes(genericTypeParams)); } this.owner = owner; }