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行上DynamicTest,aRuntimeBinderException与 message 一起被抛出'object' does not contain a definition for 'Name'

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

4

2 回答 2

3

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

dynamic编辑:伙计,直到现在我都忘记了编译器是如何处理的……这很有趣。

于 2012-12-14T05:33:39.070 回答
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
    }
};
于 2012-12-14T05:56:18.720 回答