関数にバグがあることに気づきました。
Type.GetType("System.Uri");
戻り値はnullですが、次の関数は非常にうまく機能しています...
Type.GetType("System.string");
Type.GetType("System.bool");
Type.GetType("System.DateTime");
..。
誰もが知っています、なぜ返されたタイプがnullなのですか?
編集:ウリ複式簿記を削除しました...
Type.GetType("System.Uri")
返される理由null
は、タイプがmscorlib.dllではなくsystem.dllにあるためです。上記のように、アセンブリ修飾名を使用する必要があります。
MSDNから:
typeName タイプ:System.String
取得するタイプのアセンブリ修飾名。AssemblyQualifiedNameを参照してください。タイプが現在実行中のアセンブリまたはMscorlib.dllにある場合は、名前空間で修飾されたタイプ名を指定するだけで十分です。
また、この問題にぶつかり、特にJITコンパイルを使用するASP.Netでは、アセンブリ情報が常にわかっているとは限らないことに気付きました。ReflectionUtilitiesクラスに以下を追加しました。これはある程度「ナットを割るハンマー」ですが、AssemblyQualifiedNameと基本クラスFullNameの両方で機能します。1つ目は、基本的に、発生しなければならないCurrentDomainAssembliesの検索を短絡します。
public static Type FindType(string qualifiedTypeName)
{
Type t = Type.GetType(qualifiedTypeName);
if (t != null)
{
return t;
}
else
{
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
t = asm.GetType(qualifiedTypeName);
if (t != null)
return t;
}
return null;
}
}
注:Reflectionのパフォーマンスの問題を考えると、可能な限り、これをアセンブリの修飾なしにループ内で呼び出すことはできません。必要な最初のアイテムにアクセスし、そこからアセンブリ情報を抽出して、そこから続行することをお勧めします。常に適切であるとは限りませんが、はるかに効率的です(Reflectionのいずれかが効率的と言える場合:-))。
アリステア
このコードを試してください:
Uri uri = new Uri("http://test");
Type t = Type.GetType(uri.GetType().AssemblyQualifiedName);
次に、タイプからAssemblyQualifiedNameをコピーして貼り付けることができます
別の方法は次のとおりです。
Type t = typeof(Uri);
指定された名前のタイプを取得し、大文字と小文字を区別して検索します。
戻り値
タイプ:System.Type
指定された名前のタイプ(見つかった場合)。それ以外の場合はnull。
したがって、タイプミスをすると、タイプが見つからず、null
返されます。これはバグではありません。
追加情報がなければ、完全修飾型名を使用していないと思います。現在実行中のアセンブリタイプ以外のものをロードしようとしている場合Type.GetType()
は、完全修飾タイプ名(つまりSystem.String
)だけでなく、アセンブリ修飾名も必要です。