internal bool IsMatch( TypeName other ) { var comparer = StringComparer.Ordinal; // if this type name doesn't have a namespace, then we can only match on name. if we do have a namespace, then match on full name if ( ( !HasNamespace && comparer.Equals( Name, other.Name ) ) || comparer.Equals( FullName, other.FullName ) ) { // if either type name doesn't have an assembly name, then treat them equally because they can't be compared if ( !IsAssemblyQualified || !other.IsAssemblyQualified || comparer.Equals( AssemblyName, other.AssemblyName ) ) return true; } return false; }
private Type GetTypeByName( string typeName, bool throwOnError, Exception ex ) { Contract.Requires( !string.IsNullOrEmpty( typeName ) ); Contract.Requires( ex != null ); EnsureAssemblyEntries(); var sourceType = new TypeName( typeName ); var types = ( from entry in entries from type in entry.Assembly.ExportedTypes let targetType = new TypeName( type ) where sourceType.IsMatch( targetType ) select type ).ToArray(); switch ( types.Length ) { case 0: { if ( throwOnError ) throw ex; return null; } case 1: { return types[0]; } default: { if ( throwOnError ) throw new AmbiguousMatchException( ExceptionMessage.AmbiguousTypeName.FormatDefault( typeName ) ); return null; } } }