【问题标题】:Why this dynamic parameter is not working? [duplicate]为什么这个动态参数不起作用? [复制]
【发布时间】:2013-07-11 20:55:58
【问题描述】:

在项目中考虑这段代码:

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

【问题讨论】:

  • 搜索上面的链接花了 10 秒的谷歌搜索,想想看 :-)
  • @zerkms,谢谢,我不擅长 C# 关键字怎么样 ;) 谷歌它。
  • 也许 :-) 我的搜索请求是:“C# 动态不同项目” PS:这些天我不使用 c# 开发,也没有使用过dynamic
  • @zerkms 他说:注意:我对 ExpandoObject 很熟悉,我不想使用它。所以这不是重复的
  • @Shahrooz Jefri ㇱ:哦,我明白了。是在最初的问题中吗?

标签: c# dynamic


【解决方案1】:

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

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

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

【讨论】:

  • 我猜这不是一个好的设计。但当然,我不熟悉 C# 语言和 CLR 的局限性。感谢您提供信息。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多