跨程序集使用动态对象

时间:2012-12-14 05:29:26

标签: c# dynamic

我无法让动态对象在其他程序集中的类型中工作。要复制它,创建一个新的解决方案,添加一个类库,添加一个控制台应用程序,将类库的引用添加到控制台应用程序,在类库中创建这个类:

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课程的DynamicTest行中,系统会RuntimeBinderException投放'object' does not contain a definition for 'Name'消息。

如果我将DynamicTest类移动到控制台应用程序程序集中,它将按预期工作。使用动态跨程序集是否有限制?对于动态来说,这似乎是一个非常合理的用例。

2 个答案:

答案 0 :(得分:3)

对此的普遍共识是使用ExpandoObject - 这可以跨越应用边界。

编辑:伙计,我忘记了编译器到目前为止处理dynamic的方式......这很有趣。

答案 1 :(得分:0)

继@Simon Whitehead的回答后,ExpandoObject需要在消费方面使用,即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
    }
};