Beispiel #1
0
        public static IDictionary <Type, MethodInfo> GetHandlers <T>(T target, InvocationHandlerType type)
        {
            string typestr;

            switch (type)
            {
            case InvocationHandlerType.Event: typestr = "ApplyEvent"; break;

            case InvocationHandlerType.Command: typestr = "ExecuteCommand"; break;

            default:
                throw new ArgumentOutOfRangeException(nameof(type), type, null);
            }

            return(target.GetType()
                   .GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                   .Where(m => m.Name == typestr)
                   .Where(m => m.GetParameters().Length == 1)
                   .ToDictionary(m => m.GetParameters().First().ParameterType, m => m));
        }
Beispiel #2
0
        private static void Invoke <T>(T target, object arg, InvocationHandlerType handlerType)
        {
            var type = arg.GetType();

            if (!GetHandlers(target, handlerType).TryGetValue(type, out var method))
            {
                return;
            }

            try
            {
                method.Invoke(target, new[] { arg });
            }
            catch (TargetInvocationException ex)
            {
                if (InternalPreserveStackTraceMethod != null)
                {
                    InternalPreserveStackTraceMethod.Invoke(ex.InnerException, new object[0]);
                }
            }
        }