为什么这个动态参数不起作用?

时间:2013-07-13 11:29:01

标签: c# dynamic

在项目中考虑此代码:

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,我不想使用它。

1 个答案:

答案 0 :(得分:8)

您的代码使用匿名类型。最初打算在Linq select 查询表达式中有用,在C#版本3中添加。不幸的是,C#编译器使用可访问性修饰符生成它们,匿名类型中的成员设置为 internal < / strong>即可。可访问性由CLR强制执行。在Linq中不是问题,因为迭代器也将在同一个程序集中生成。没有设想将它们与 dynamic 关键字一起使用,它是在后来的C#版本4中添加的。

这意味着只要代码全部在同一个程序集中,它就可以正常工作。但是,只要将对象传递给另一个程序集中的代码, internal 强制执行的限制就会启动并进入kaboom。

简单地宣布一个小公共课就是解决方法。 ExpandoObject也可以工作,但会增加不必要的开销。