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

标签 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' does not contain a definition for 'Name' (RuntimeBinderException)

为什么会出现此错误?有什么替代方法?如何将动态参数传递给另一个库中的方法,并以简单的方式在那里使用它?

注意:我熟悉 ExpandoObject,我不想使用它。

最佳答案

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

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

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

关于c# - 为什么这个动态参数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17629755/

相关文章:

c# - 使用 CSExeCOMServer 如何在 VS C++ 中接收事件

c# - ToString() 方法是否违反 SRP?

jquery动态id选择器,删除然后添加类

动态创建后未应用完整 CSS 的 Jquery Mobile 复选框 radio

c# - 从 C# 中的大型数据结构中释放内存

c# - 使用 Amazon.Lambda.AspNetCoreServer 的自定义授权方数据

php - 在 PHP 中从具有动态类名的类中获取静态属性

vb.net - VB中的动态方法调用没有反射

c# - 定时器(System.Threading)线程安全

javascript - 动态变量