예제 #1
0
        private void Subscribe(UnmanagedDispose disposable, MethodInfo methodInfo, string name)
        {
            var parms = methodInfo.GetParameters();
            var types = parms.Select(x => x.ParameterType).ToArray();
            var hash  = HashCode.Combine(types);

            if (!_eventWireUpCache.TryGetValue(hash, out var wire))
            {
                wire = new EventAutoWire(hash, types);
                _eventWireUpCache.Add(hash, wire);
            }

            disposable.Track(wire.Subscribe(_events, disposable, methodInfo, name));
        }
예제 #2
0
        public void Subscribe(UnmanagedDispose disposable)
        {
            var type    = disposable.GetType();
            var methods = from method in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)
                          select new { method, attr = method.GetCustomAttribute <EventAttribute>() };

            foreach (var m in methods)
            {
                if (m.attr != null)
                {
                    var name = m.attr?.Name ?? m.method.Name;
                    Subscribe(disposable, m.method, name);
                }
            }
        }
예제 #3
0
 public IDisposable Subscribe(IEventManager events, UnmanagedDispose disposable, MethodInfo mi, string name)
 {
     if (Types.Length > 0)
     {
         var action        = typeof(Action <>);
         var genericAction = action.MakeGenericType(Types);
         var dg            = mi.CreateDelegate(genericAction, disposable);
         return(_wireUp(events, name, dg));
     }
     else
     {
         var dg = mi.CreateDelegate(typeof(Action), disposable);
         return(_wireUp(events, name, dg));
     }
 }