1

私は本 Pro C# 5.0 の例に従おうとしていますが、うまくいかないものに出くわしました:

static void Main() {

    Assembly asm = Assembly.Load("CarLibrary");

    Type MiniVan = asm.GetType("CarLibrary.MiniVan");

    dynamic d = Activator.CreateInstance(Minivan);

    Console.WriteLine("Type of d is {0}", d.GetType()); // Type is CarLibrary.MiniVan

    MethodInfo m = MiniVan.GetMethod("TurboBoost");
    m.Invoke(d, null); // This works fine, and prints out "Turbo Boosting"

    d.TurboBoost(); // This doesn't work like the book says it should. 
                    // I get: object does not contain a definition for TurboBoost;

CarLibrary の宣言は次のとおりです。

namespace CarLibrary {

    // UPDATE: I just realized that I had declared MiniVan internal
    internal MiniVan {

        public void TurboBoost() {

            Console.WriteLine("Turbo Boosting");
        }
    }
}

したがって、MiniVan が INTERNAL として宣言されていても、Reflection を使用して MiniVan のインスタンスを作成し、TurboBoost() を呼び出すことができます。しかし、dynamic キーワードを使用すると、TurboBoost() の呼び出しが機能しません。ただし、MiniVan が PUBLIC と宣言されている場合は、どちらの場合も完全に機能します。

それがすべて想定どおりかどうか誰か教えてもらえますか?

4

1 に答える 1

3

dynamicメンバーのアクセシビリティだけでなく、オブジェクトの型が(ネストされている) でinternalあるかどうかなども含むアクセシビリティ規則を尊重します。これは単なるリフレクションラッパーではありません。privatedynamic

これは、 assemblydynamic CarLibraryでの同じ使用が機能したことを意味します。を介してタイプメンバーにアクセスする場合は、少なくとも呼び出しコンテキストでアクセスできるdynamic必要があります。public

特に、これにより、直接知る必要のない型publicのメンバーにアクセスして、ランタイムをごまかすことができなくなります。たとえば、コア CLI タイプが何らかのインターフェースを実装するとします。internal

public ISomeInterface {...}
internal SomeMicrosoftType : ISomeInterface
{
    public void FireTheMissiles() {...}
}

今; そのオブジェクトをISomeInterfaceインスタンスとして公開する API が存在する可能性があります。そのため、そのオブジェクトへの参照を合法的に取得できます。通常のコードでは、 のメンバーにアクセスできISomeInterfaceましたが、 を呼び出すことはできませんでしたFireTheMissilesただし、提案がうまくいった場合は、次のことができます。

ISomeInterface innocent = ...
dynamic evil = innocent;
evil.FireTheMissiles();

さて、はい、リフレクションを介してそれを行うことができますが、特に完全な信頼で実行していない場合、リフレクションには追加のチェックがあります。

于 2012-10-12T06:45:54.507 に答える