1

動的オブジェクトを他のアセンブリの型で動作させることができません。これを複製するには、新しいソリューションを作成し、クラス ライブラリを追加し、コンソール アプリケーションを追加し、クラス ライブラリへの参照をコンソール アプリケーションに追加し、クラス ライブラリにこのクラスを作成します。

public class DynamicTest
{
    public dynamic People { get; set; }
    public override string ToString()
    {
        var sb = new StringBuilder();

        foreach (var person in People)
        {
            sb.AppendLine(person.Name);
        }

        return sb.ToString();
    }
}

そして、これをコンソール アプリケーションの に挿入しますProgram.Main()

var test = new DynamicTest
{
    People = new[] { 
        new { Name = "John" },
        new { Name = "Jane" }
    }
};

Console.WriteLine(test.ToString());
Console.ReadLine();

コンソール アプリケーションを実行します。クラスのsb.AppendLine行で、メッセージとともに a がスローされます。DynamicTestRuntimeBinderException'object' does not contain a definition for 'Name'

DynamicTestクラスをコンソール アプリケーション アセンブリに移動すると、期待どおりに動作します。アセンブリ間での動的使用に制限はありますか? これは、ダイナミックの非常に合理的な使用例のようです。

4

2 に答える 2

3

これに対する一般的なコンセンサスは、ExpandoObjectを使用することです。これは、アプリの境界を越えることができる同等のものです。

編集: おい、コンパイラが今までどのように扱ったか忘れたdynamic..それは魅力的だ.

于 2012-12-14T05:33:39.070 に答える
0

Following on from @Simon Whitehead's answer, ExpandoObject needs to be used on the consuming side, i.e. in Program.Main():

dynamic john = new ExpandoObject();
john.Name = "John";

dynamic jane = new ExpandoObject();
jane.Name = "Jane";

var test = new DynamicTest
{
    People = new ExpandoObject[] {
        john,
        jane
    }
};
于 2012-12-14T05:56:18.720 に答える