コード例 #1
0
        public static bool ContainsGenericParameters(this IType type, Predicate <IType> furtherRestriction)
        {
            if (type.IsGenericConstruct && type is IGenericType)
            {
                if (((IGenericType)(type)).IsGenericDefinition)
                {
                    return(furtherRestriction(type));
                }
                else
                {
                    return(((IGenericType)(type)).GenericParameters.ContainsGenericParameters(furtherRestriction));
                }
            }
            else
            {
                switch (type.ElementClassification)
                {
                case TypeElementClassification.Array:
                case TypeElementClassification.Nullable:
                case TypeElementClassification.Pointer:
                case TypeElementClassification.Reference:
                    return(type.ElementType.ContainsGenericParameters(furtherRestriction));

                case TypeElementClassification.ModifiedType:
                    IModifiedType mType = type as IModifiedType;
                    if (mType != null)
                    {
                        return(mType.ElementType.ContainsGenericParameters() ||
                               mType.Modifiers.Any(k => k.ModifierType.ContainsGenericParameters(furtherRestriction)));
                    }
                    break;
                }
                return(type.IsGenericTypeParameter && furtherRestriction(type));
            }
        }
コード例 #2
0
        internal static bool ContainsSymbols(this IType type)
        {
            if (type.IsGenericTypeParameter && !type.IsGenericConstruct)
            {
                return(((IGenericType)(type)).ContainsSymbols());
            }
            switch (type.ElementClassification)
            {
            case TypeElementClassification.Array:
            case TypeElementClassification.Nullable:
            case TypeElementClassification.Pointer:
            case TypeElementClassification.Reference:
                return(type.ElementType.ContainsSymbols());

                break;

            case TypeElementClassification.ModifiedType:
                IModifiedType mType = type as IModifiedType;
                if (mType != null)
                {
                    return(mType.ElementType.ContainsSymbols() ||
                           mType.Modifiers.Any(k => k.ModifierType.ContainsSymbols()));
                }
                break;
            }
            return(type is ISymbolType);
        }
コード例 #3
0
        public static IType GetFirstGenericParameter(this IType type, Predicate <IType> furtherRestriction)
        {
            if (type.IsGenericConstruct && type is IGenericType)
            {
                if (((IGenericType)(type)).IsGenericDefinition)
                {
                    return(((IGenericType)(type)).GenericParameters.FirstOrDefault(k => furtherRestriction(k)));
                }
                else
                {
                    return(((IGenericType)(type)).GenericParameters.GetFirstGenericParameter(furtherRestriction));
                }
            }
            else
            {
                switch (type.ElementClassification)
                {
                case TypeElementClassification.Array:
                case TypeElementClassification.Nullable:
                case TypeElementClassification.Pointer:
                case TypeElementClassification.Reference:
                    return(type.ElementType.GetFirstGenericParameter(furtherRestriction));

                case TypeElementClassification.ModifiedType:
                    IModifiedType mType = type as IModifiedType;
                    if (mType != null)
                    {
                        return(mType.ElementType.GetFirstGenericParameter(furtherRestriction) ??
                               mType.Modifiers.Where(k => k.ModifierType.ContainsGenericParameters(furtherRestriction)).Select(k => k.ModifierType.GetFirstGenericParameter(furtherRestriction)).FirstOrDefault());
                    }
                    break;
                }
                return(type.IsGenericTypeParameter && furtherRestriction(type)
                       ? type
                       : null);
            }
        }