protected override MethodGenerator GetMethodGenerator(MetaMethod method, ClassEmitter @class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) { if (methodsToSkip.Contains(method.Method)) { return null; } if (!method.Proxyable) { return new MinimialisticMethodGenerator(method, overrideMethod); } if (ExplicitlyImplementedInterfaceMethod(method)) { #if SILVERLIGHT return null; #else return ExplicitlyImplementedInterfaceMethodGenerator(method, @class, options, overrideMethod); #endif } var invocation = GetInvocationType(method, @class, options); return new MethodWithInvocationGenerator(method, @class.GetField("__interceptors"), invocation, (c, m) => new TypeTokenExpression(targetType), overrideMethod, null); }
protected override MethodGenerator GetMethodGenerator(MetaMethod method, ClassEmitter @class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) { if (methodsToSkip.Contains(method.Method)) { return null; } if (!method.Proxyable) { return new MinimialisticMethodGenerator(method, overrideMethod); } if (IsDirectlyAccessible(method) == false) { return IndirectlyCalledMethodGenerator(method, @class, options, overrideMethod); } var invocation = GetInvocationType(method, @class, options); return new MethodWithInvocationGenerator(method, @class.GetField("__interceptors"), invocation, (c, m) => c.GetField("__target").ToExpression(), overrideMethod, null); }
public virtual void Generate(ClassEmitter @class, ProxyGenerationOptions options) { var interceptors = @class.GetField("__interceptors"); ImplementProxyTargetAccessor(@class, interceptors); foreach (var attribute in targetType.GetNonInheritableAttributes()) { @class.DefineCustomAttribute(attribute); } }
protected override MethodGenerator GetMethodGenerator(MetaMethod method, ClassEmitter @class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) { var invocation = GetInvocationType(method, @class, options); return new MethodWithInvocationGenerator(method, @class.GetField("__interceptors"), invocation, (c, m) => c.GetField("__target").ToExpression(), overrideMethod, null); }
protected override MethodGenerator GetMethodGenerator(MetaMethod method, ClassEmitter @class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) { if (!method.Proxyable) { return new MinimialisticMethodGenerator(method, overrideMethod); } var invocation = GetInvocationType(method, @class, options); return new MethodWithInvocationGenerator(method, @class.GetField("__interceptors"), invocation, getTargetExpression, overrideMethod, null); }
private Expression SetMethodInterceptors(ClassEmitter @class, INamingScope namingScope, MethodEmitter emitter, Expression proxiedMethodTokenExpression) { var selector = @class.GetField("__selector"); if(selector == null) { return null; } var methodInterceptorsField = BuildMethodInterceptorsField(@class, MethodToOverride, namingScope); var emptyInterceptors = new NewArrayExpression(0, typeof(IInterceptor)); var selectInterceptors = new MethodInvocationExpression(selector, InterceptorSelectorMethods.SelectInterceptors, new MethodInvocationExpression(null, TypeUtilMethods.GetTypeOrNull, getTargetExpression(@class, MethodToOverride)), proxiedMethodTokenExpression, interceptors.ToExpression()) { VirtualCall = true }; emitter.CodeBuilder.AddExpression( new IfNullExpression(methodInterceptorsField, new AssignStatement(methodInterceptorsField, new NullCoalescingOperatorExpression(selectInterceptors, emptyInterceptors)))); return methodInterceptorsField.ToExpression(); }
protected virtual Type Init(string typeName, out ClassEmitter emitter, Type proxyTargetType, out FieldReference interceptorsField, IEnumerable<Type> interfaces) { var baseType = ProxyGenerationOptions.BaseTypeForInterfaceProxy; emitter = BuildClassEmitter(typeName, baseType, interfaces); CreateFields(emitter, proxyTargetType); CreateTypeAttributes(emitter); interceptorsField = emitter.GetField("__interceptors"); return baseType; }
private MethodGenerator IndirectlyCalledMethodGenerator(MetaMethod method, ClassEmitter proxy, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) { var @delegate = GetDelegateType(method, proxy, options); var contributor = GetContributor(@delegate, method); var invocation = new CompositionInvocationTypeGenerator(targetType, method, null, false, contributor) .Generate(proxy, options, namingScope) .BuildType(); return new MethodWithInvocationGenerator(method, proxy.GetField("__interceptors"), invocation, (c, m) => c.GetField("__target").ToExpression(), overrideMethod, contributor); }
protected override Expression GetTargetReferenceExpression(ClassEmitter emitter) { return emitter.GetField("__target").ToExpression(); }
private MethodGenerator ExplicitlyImplementedInterfaceMethodGenerator(MetaMethod method, ClassEmitter @class, ProxyGenerationOptions options, OverrideMethodDelegate overrideMethod) { var @delegate = GetDelegateType(method, @class, options); var contributor = GetContributor(@delegate, method); var invocation = new InheritanceInvocationTypeGenerator(targetType, method, null, contributor) .Generate(@class, options, namingScope) .BuildType(); return new MethodWithInvocationGenerator(method, @class.GetField("__interceptors"), invocation, (c, m) => new TypeTokenExpression(targetType), overrideMethod, contributor); }
private Reference GetTarget(ClassEmitter @class, MethodInfo method) { return new AsTypeReference(@class.GetField("__target"), method.DeclaringType); }