public void GivenAType_WhenSearchingForTypeHierarchy_ShouldReturnBaseTypesAndInputType(Type input, IEnumerable<Type> expectedResult)
        {
            var inspector = new TypeInspector();

            var result = inspector.GetTypeHierarchy(input);

            CollectionAssert.AreEqual(expectedResult, result);
        }
        public void GivenAType_WhenSearchingForTypeHierarchy_ShouldReturnBaseTypesAndInputType(Type input, IEnumerable <Type> expectedResult)
        {
            var inspector = new TypeInspector();

            var result = inspector.GetTypeHierarchy(input);

            CollectionAssert.AreEqual(expectedResult, result);
        }
        /// <summary>
        /// Returns the Apply methods for each type in the event type's inheritance
        /// hierarchy, top-down, from interfaces before classes.
        /// </summary>
        private IEnumerable <MethodInfo> FindApplyMethods(object evt)
        {
            var typeInspector = new TypeInspector();

            var typeHierarchy = typeInspector.GetTypeHierarchy(evt.GetType());

            var applyMethods = Enumerable.Select <Type, MethodInfo>(typeHierarchy, FindApplyMethod)
                               .Where(x => x != null)
                               .ToList();

            if (Conventions.AggregatesMustImplementApplyMethods && applyMethods.Count == 0)
            {
                throw new InvalidOperationException(
                          string.Format(
                              "Class {0} does not implement an Apply() method for {1} or any of it's superclasses. Either implement the method or set Conventions.AggregatesMustImplementApplyMethods to false.",
                              GetType().Name,
                              evt.GetType()));
            }

            return(applyMethods);
        }
        private MethodInfo FindApplyMethod(Type eventType)
        {
            var typeInspector = new TypeInspector();

            MethodInfo applyMethod;

            if (false == _applyMethodCache.TryGetValue(eventType.TypeHandle, out applyMethod))
            {
                applyMethod =
                    Enumerable.SelectMany <Type, MethodInfo>(typeInspector.GetTypeHierarchy(GetType()), x => x.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic))
                    .Where(m => m.Name == "Apply")
                    .Where(
                        m =>
                {
                    var parameters = m.GetParameters();
                    return(parameters.Length == 1 && parameters[0].ParameterType == eventType);
                }).SingleOrDefault();

                _applyMethodCache.Add(eventType.TypeHandle, applyMethod);
            }

            return(applyMethod);
        }
Exemple #5
0
        /// <summary>
        /// Returns the Apply methods for each type in the event type's inheritance
        /// hierarchy, top-down, from interfaces before classes.
        /// </summary>
        private IEnumerable<MethodInfo> FindApplyMethods(object evt)
        {
            var typeInspector = new TypeInspector();

            var applyMethods = typeInspector.GetTypeHierarchy(evt.GetType())
                                            .Select(FindApplyMethod)
                                            .Where(x => x != null)
                                            .ToList();

            return applyMethods;
        }
        private static IEnumerable <Type> GetEventTypeHierarchy(Type eventType)
        {
            var inspector = new TypeInspector();

            return(inspector.GetTypeHierarchy(eventType));
        }