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)); } }
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); }
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); } }