在项目中考虑此代码:
static void Main(string[] args)
{
DoSomething(new { Name = "Saeed" });
}
public static void DoSomething(dynamic parameters)
{
Console.WriteLine(parameters.Name);
}
这就像一个魅力。但是,只要将这两个函数分成两个不同的项目,代码就会中断:
// This code is in a Console Application
static void Main(string[] args)
{
ExternalClass.DoSomething(new { Name = "Saeed" });
}
// However, this code is in a Class Library; Another project
public class ExternalClass
{
public static void DoSomething(dynamic parameters)
{
Console.WriteLine(parameters.Name);
}
}
我在第二种情况下得到的错误是:
object'不包含'Name'(RuntimeBinderException)的定义
为什么会出现此错误?什么是替代方法?如何将动态参数传递给另一个库中的方法,并以简单的方式在那里使用它?
注意:我熟悉ExpandoObject
,我不想使用它。
答案 0 :(得分:8)
您的代码使用匿名类型。最初打算在Linq select 查询表达式中有用,在C#版本3中添加。不幸的是,C#编译器使用可访问性修饰符生成它们,匿名类型中的成员设置为 internal < / strong>即可。可访问性由CLR强制执行。在Linq中不是问题,因为迭代器也将在同一个程序集中生成。没有设想将它们与 dynamic 关键字一起使用,它是在后来的C#版本4中添加的。
这意味着只要代码全部在同一个程序集中,它就可以正常工作。但是,只要将对象传递给另一个程序集中的代码, internal 强制执行的限制就会启动并进入kaboom。
简单地宣布一个小公共课就是解决方法。 ExpandoObject也可以工作,但会增加不必要的开销。