/// <summary> /// Constructs a new reflective parent Accessor for the provided object. /// </summary> /// <param name="parent">Object to provide Property Access.</param> public ParentAccessor(IParentAccessorAcceptor parent) { this.parent = new WeakReference <IParentAccessorAcceptor>(parent); typeinfo = parent.GetType(); actions = new Dictionary <string, Action>(); events = new Dictionary <string, Func <string[], Task <string> > >(); }
/// <summary> /// Constructs a new reflective parent Accessor for the provided object. /// </summary> /// <param name="parent">Object to provide Property Access.</param> public ParentAccessor(IParentAccessorAcceptor parent, DispatcherQueue queue) { _queue = queue; this.parent = new WeakReference <IParentAccessorAcceptor>(parent); typeinfo = parent.GetType(); actions = new Dictionary <string, Action>(); action_parameters = new Dictionary <string, Action <string[]> >(); events = new Dictionary <string, Func <string[], Task <string> > >(); }
public SubscriptionProxy(object subscriber) { this.subscriber = new WeakReference(subscriber); var interfaces = subscriber.GetType() .GetInterfaces() .Where(i => i.IsGenericType && typeof(IReceive <>) == i.GetGenericTypeDefinition()); foreach (var @interface in interfaces) { var messageType = @interface.GetGenericArguments()[0]; var method = @interface.GetMethod("Receive"); subscribersByMessageType[messageType] = method; } }
private void InitProxyDelegate() { Type targetEventHandlerReturnType = targetEventHandlerMethodInfo.ReturnType; Type[] parametersTypes = GetParametersTypes(targetEventHandlerMethodInfo.GetParameters()); Type[] allParameters = new Type[parametersTypes.Length + 1]; Array.Copy(parametersTypes, 0, allParameters, 1, parametersTypes.Length); allParameters[0] = typeof(WeakDelegateDynamicMethod); DynamicMethod proxyEventHandler = new DynamicMethod( "ProxyEventHandler", targetEventHandlerReturnType, allParameters, typeof(WeakDelegateDynamicMethod) ); ILGenerator ilGenerator = proxyEventHandler.GetILGenerator(); Label endMethodLabel = ilGenerator.DefineLabel(); var weakReferenceFieldInfo = this.GetType().GetField("weakReferenceToTarget", BindingFlags.NonPublic | BindingFlags.Instance); var targetPropertyGetMethodInfo = weakReferenceToTarget.GetType().GetProperty("Target").GetGetMethod(); Type[] invokeMethodArgs = new Type[] { typeof(object), typeof(object[]) }; var invokeMethodInfo = targetEventHandlerMethodInfo.GetType().GetMethod("Invoke", invokeMethodArgs); ilGenerator.Emit(OpCodes.Nop); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldfld, weakReferenceFieldInfo); ilGenerator.Emit(OpCodes.Callvirt, targetPropertyGetMethodInfo); ilGenerator.Emit(OpCodes.Stloc_0); ilGenerator.Emit(OpCodes.Ldloc_0); ilGenerator.Emit(OpCodes.Ldnull); ilGenerator.Emit(OpCodes.Cgt_Un); ilGenerator.Emit(OpCodes.Stloc_1); ilGenerator.Emit(OpCodes.Ldloc_1); ilGenerator.Emit(OpCodes.Brfalse_S, endMethodLabel); ilGenerator.Emit(OpCodes.Nop); ilGenerator.Emit(OpCodes.Ldarg_0); ilGenerator.Emit(OpCodes.Ldfld, targetEventHandlerMethodInfo); ilGenerator.Emit(OpCodes.Ldloc_0); ilGenerator.Emit(OpCodes.Ldarg_1); ilGenerator.Emit(OpCodes.Callvirt, invokeMethodInfo); ilGenerator.Emit(OpCodes.Pop); ilGenerator.Emit(OpCodes.Nop); ilGenerator.MarkLabel(endMethodLabel); ilGenerator.Emit(OpCodes.Ret); Type[] delegateParameters = new Type[parametersTypes.Length + 1]; Array.Copy(parametersTypes, 0, delegateParameters, 0, parametersTypes.Length); delegateParameters[delegateParameters.Length - 1] = targetEventHandlerReturnType; Type delegateType = Expression.GetDelegateType(delegateParameters); proxyDelegate = proxyEventHandler.CreateDelegate(delegateType, this); }