System.Runtime.CompilerService.Dynamic属性来自哪里,我们应该使用它吗?

时间:2018-03-27 11:41:03

标签: c# .net

今天我正在查看Nancy的一些代码,因为我喜欢探索我注意到的代码。

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

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

现在我不知道这个属性是做什么的,所以我立即去了msdn

  

参数

     

transformFlags:的   类型:System.Boolean []   指定在类型结构的前缀遍历中,哪些对象出现被视为动态调度类型。

     

说明

     

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

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

所以底线问题是:

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

1 个答案:

答案 0 :(得分:4)

C#中的fx:controller关键字在元数据中没有专用类型,在运行时,它只是对象。当您添加对程序集的引用时,您希望将其视为 dynamic 。 C#编译器也是必需的,因此它可以自动生成绑定器代码。 [Dynamic]属性确保发生这种情况。

反编译器会做同样的事情,所以它也不必向你展示这个属性。无论您使用什么工具浏览元数据都不是那么顺利,并且揭示了细节。

C#编译器自动发出属性。你不需要自己做。