示例#1
0
        private static bool IsSubTypeOf(List <TypeDefinition> types, TypeIdentity parent, TypeIdentity child)
        {
            var childDef = types.Find(t => t.Identity.Equals(child));

            var directParent = childDef.BaseType;

            while (directParent != null)
            {
                if (parent.Equals(directParent))
                {
                    return(true);
                }

                var directParentDef = types.Find(t => t.Identity.Equals(directParent));
                directParent = directParentDef.BaseType;
            }

            foreach (var baseInterface in childDef.BaseInterfaces)
            {
                if (parent.Equals(baseInterface))
                {
                    return(true);
                }
            }

            return(false);
        }
示例#2
0
 private bool AvailableTypeMatchesRequiredType(TypeIdentity requiredType, TypeIdentity availableType)
 {
     return((availableType != null) && (requiredType.Equals(availableType) || m_Repository.IsSubTypeOf(requiredType, availableType)));
 }
示例#3
0
        public static bool OpenGenericIsAssignableFrom(
            TypeIdentity openGeneric,
            TypeDefinition type,
            Func<TypeIdentity, TypeDefinition> toDefinition)
        {
            // Terminate recursion
            if ((type == null) || openGeneric.Equals(type))
            {
                return false;
            }

            // typeToCheck is a closure of openGenericType
            var isClosureOfGenericType = type.Identity.IsGenericType && openGeneric.Equals(type.GenericTypeDefinition);

            // typeToCheck is the subclass of a closure of openGenericType
            var isSubClassOfClosure = OpenGenericIsAssignableFrom(openGeneric, toDefinition(type.BaseType), toDefinition);

            // typeToCheck inherits from an interface which is the closure of openGenericType
            var inheritsClosureInterface = type.BaseInterfaces.Any(
                interfaceType => OpenGenericIsAssignableFrom(openGeneric, toDefinition(interfaceType), toDefinition));

            return isClosureOfGenericType || isSubClassOfClosure || inheritsClosureInterface;
        }
示例#4
0
 private bool AvailableTypeMatchesRequiredType(TypeIdentity requiredType, TypeIdentity availableType)
 {
     return (availableType != null) && (requiredType.Equals(availableType) || m_Repository.IsSubTypeOf(requiredType, availableType));
 }
        private static bool IsSubTypeOf(List<TypeDefinition> types, TypeIdentity parent, TypeIdentity child)
        {
            var childDef = types.Find(t => t.Identity.Equals(child));

            var directParent = childDef.BaseType;
            while (directParent != null)
            {
                if (parent.Equals(directParent))
                {
                    return true;
                }

                var directParentDef = types.Find(t => t.Identity.Equals(directParent));
                directParent = directParentDef.BaseType;
            }

            foreach (var baseInterface in childDef.BaseInterfaces)
            {
                if (parent.Equals(baseInterface))
                {
                    return true;
                }
            }

            return false;
        }