5

API ドキュメントから、ReflectionOnlyGetType が GetType と同じように型を返すことを理解しています。違いは、ReflectionOnlyGetType では、型が実行ではなくリフレクションのみに読み込まれることです。

では、なぜこれが機能するのでしょうか。

    Type t = Type.ReflectionOnlyGetType("System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false, false);
    ConstructorInfo[] cis = t.GetConstructors();
    foreach (ConstructorInfo ci in cis)
    {
        if (ci.GetParameters().Length == 0)
        {
            // ! no arg constructor found! let's call it!
            Object o = ci.Invoke(new Object[]{});
            Console.WriteLine("But wait, it was supposed to be reflection only??");
            Console.WriteLine(o.GetType().Name);
            List<String> lli = (List<String>)o;
            lli.Add("but how can this be?");
            Console.WriteLine(lli.Count);
            Console.WriteLine("I am doing a lot more than reflection here!");
        }
    }

私の質問は: 私はこのタイプのメンバーを反映​​する以上のことができるようです. タイプが「実行ではなくリフレクションのみにロードされる」と彼らが言うとき、私は「実行」を誤解しましたか? または、タイプが既に「ロード」されていて、mscorlib にあるためにここでロードされた場合、ReflectionOnlyGetType は別の (非反射のみの) タイプを返しますか? それとも全然違うものですか?

4

1 に答える 1

3

mscorlibランタイムによる実行のために既に読み込まれている型を読み込んでいます。AssemblyのプロパティをチェックしReflectionOnlyて、ReflectionOnly コンテキストに読み込まれているかどうかを確認できます。あなたのサンプルでは、

Type t = Type.ReflectionOnlyGetType("System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false, false);
Console.WriteLine(t.Assembly.ReflectionOnly); // prints False.

mscorlib のリフレクションは多少制限されているようです。MSDNから:

リフレクションのみのコンテキストを使用して、実行コンテキストのバージョン以外のバージョンの .NET Framework から mscorlib.dll のバージョンを読み込むことはできません。

それは、現在の実行コンテキストにあるものをリフレクションのみのコンテキストにロードすることにまで及ぶと思います。

他の BCL アセンブリでも動作するようです:

Console.WriteLine(Assembly.ReflectionOnlyLoad("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089").ReflectionOnly); // prints True
于 2012-11-21T08:32:24.483 に答える