【问题标题】:Where does System.Runtime.CompilerService.Dynamic attribute comes from and are we supposed to use it?System.Runtime.CompilerServices.Dynamic 属性来自哪里,我们应该使用它吗?
【发布时间】:2018-03-27 11:41:03
【问题描述】:

今天我在看Nancy 的一些代码,因为我喜欢探索代码,所以我注意到以下内容。

在 VS2017 中导航时,我去了NancyModule,我从元数据中看到了以下代码:

public virtual void Delete(string path, [Dynamic(new[] { false, true, false })] Func action, Func condition = null, string name = null);`

现在我不知道这个属性有什么作用,所以我立即去了msdn

参数

转换标志: 类型:System.Boolean[] 指定,在类型构造的前缀遍历中,哪些 Object 出现应被视为动态分派的类型。

备注

例如,如果 C 是具有两个类型参数的泛型类型,则使用构造的类型 C 可能旨在动态处理第一个类型参数,而通常处理第二个类型参数,在这种情况下,应适当的属性规范使用 { false, true, false } 的 transformFlags 值。

之后我意识到在 Nancy 的 code 中没有应用这样的属性,所以我想自己“好吧,也许编译器会添加它。”但是,在使用 dnSpy、ilSpy 反编译此程序集后,我根本看不到这样的属性。

所以底线问题是:

  • 此属性是供 .NET 框架的用户使用,还是只有编译器应用它(考虑到它的命名空间)?
  • 这些标志在其构造函数中意味着什么?我不确定我是否理解类型构造的前缀遍历

【问题讨论】:

  • 当使用 ILSpy 时,看看当你切换到 IL 而不是 C# 时是如何反编译的。您应该会看到该属性出现。 dynamic 只是 object 的底层,其属性表明实际类型是 dynamic 而不仅仅是普通的 object。同样,Func<dynamic, object> 实际上是Func<object, object>,指定第一个参数的属性是dynamic。 VS 使用的反编译器不够聪明,无法将其转回“规范”C#。

标签: c# .net


【解决方案1】:

C# 中的 dynamic 关键字在元数据中没有专用类型,在运行时,它只是 object。当您添加对程序集的引用时,您希望将其返回为动态。 C# 编译器也是如此,这是必要的,因此它可以自动生成活页夹代码。 [Dynamic] 属性可确保发生这种情况。

反编译器会做同样的事情,所以它也不必显示这个属性。无论您使用哪种工具来浏览元数据,都不是那么流畅,并且显示了细节。

C# 编译器自动发出属性。无需您自己做任何事情。

【讨论】:

  • 不错!我偷偷地希望你回答我的问题,这一切都很好,但是你仍然知道这些转换标志及其含义,因为 msdn 没有说太多:(
  • 对于 C# 程序员来说,supposed 并不重要,所以 MSDN 没有太多需要说的。他们必须记录,因为它是公开的,但更愿意尽可能少地记录它,以防万一他们决定更改它。这对于编写 .NET 编译器的程序员来说确实很重要,但他们必须首先了解 DLR 绑定器。陡峭的学习曲线。
  • 其实我忘了问你你知道“类型构造的前缀遍历”是什么意思吗?
  • 我不太清楚,它是 gobbledygook。 “类型构造”是指泛型类型的类型参数。我不知道第一个是做什么的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多