예제 #1
0
 /// <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> > >();
 }
예제 #2
0
        /// <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> > >();
        }
예제 #3
0
            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;
                }
            }
예제 #4
0
        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);
        }