2

MyLibrary1動的オブジェクトを返す静的メソッドがあります。

public static dynamic GetObjects()
{
return new { test = "something" };
}

しかし、から上記のメソッドにアクセスするとMyLibrary2、デバッガーは値とオブジェクトが正しく返されたことを示します。

dynamic b = MyLibrary1.GetObjects();
string name = b.test;

を読むRuntimeBinderExceptionと「.'object' does not contain a definition for 'test'b.test

メソッドを呼び出しライブラリに移動すると、同じコードが期待どおりに機能します。

4

2 に答える 2

4

匿名型はパブリックではなく、dynamic内部/プライベートに侵入して使用できるという意味ではありません。ただし、反射は行います。

属性を使用して、他のアセンブリが内部型を使用できるようにすることができます。

// specified in assembly, defining MyLibrary1 class
[assembly: InternalsVisibleTo("Assembly, where you call MyLibrary1.GetObjects()")]

これにより、動的に匿名型を使用する際の問題が完全に修正されます。

これは、指定されたアセンブリによってすべての内部型にアクセスできることを意味することに注意してください。

于 2013-08-04T04:14:35.257 に答える
0

この追加情報をどこに含めればよいかわかりません。

これは、.NET 4 を対象とし、.NET 4 を参照しているコンソール アプリとクラス ライブラリで確認しましたMicrosoft.CSharp.dll。同じコンソール アプリの関数によって返された結果と、ライブラリから返された結果を比較しています。

を呼び出すとd.GetType().GetProperties()、どちらも、test定義した単一のプロパティを表示します。

当然のことながら、これは両方で機能します。

    static string GetStringPropertyValue(dynamic d, string propertyName)
    {
        Type t = d.GetType();

        return t.GetProperty(propertyName).GetValue(d, null);
    }

そのため、なぜそれが機能するのかについて非常に混乱していますが、単に.testプロパティを取得するだけでは、両方で機能しません。

于 2013-08-04T03:41:46.820 に答える