我无法让动态对象在其他程序集中的类型中工作。要复制它,创建一个新的解决方案,添加一个类库,添加一个控制台应用程序,将类库的引用添加到控制台应用程序,在类库中创建这个类:
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
类移动到控制台应用程序程序集中,它将按预期工作。使用动态跨程序集是否有限制?对于动态来说,这似乎是一个非常合理的用例。
答案 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
}
};