11

在项目中考虑以下代码:

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

4

1 回答 1

8

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

这意味着只要代码都在同一个程序集中,它就可以正常工作。但是,一旦您将对象传递给另一个程序集中的代码,内部强制执行的限制就会生效,并且它会大爆炸。

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

于 2013-07-13T12:09:50.743 回答