【问题标题】:Property-of aka infoof -- via Rosyln?又名 infoof 的财产——通过 Rosyln?
【发布时间】:2012-06-29 05:03:30
【问题描述】:

几年前,Eric Lippert blogged 谈到了一个假设的 infoof 运算符,它允许您在编译时而不是运行时获取方法/属性信息。基本上说这是一匹不错的小马,但没有独角兽....

我读过一些关于 Rosyln 在编译时重写代码的能力,使用 Roslyn 实现 infoof 有多难?

编辑:我认为这可能是获得 Eric 所说的他们正在考虑的所有内容的一种方式,但我应该稍微分解一下这些功能以防万一。

  1. 获取属性名称。
  2. 获取属性类型。
  3. 获取属性访问器。
  4. 获取方法名称。
  5. 通过 infoof 获取他所指的一切......

以重构安全的方式,在编译时得到验证。就我个人而言,1 涵盖了我实际使用的大约 90%(用于获取呼叫者姓名的新呼叫者信息属性实际上可以涵盖大约 60%,但当然,如果有一种方法可以在该方法的内部和外部工作,那会更好)。

【问题讨论】:

  • 我怀疑这是可能的。使用typeof,运算符参数被明确定义并且没有歧义(只有一种类型具有特定的名称和类型参数,撇开命名空间问题不谈)。但是,infoof 如何区分例如void MyFunc(string arg)void MyFunc(int arg)?
  • Eric 在他的博客文章中提供了一种可能的语法来区分这些语法,尽管对于一些令人讨厌的情况仍然不够。
  • 只需创建一个委托并获取Target
  • @leppie 如何“创建”一个委托给属性设置器或获取器?
  • @leppie: nameof 用于获取属性名称并在编译时工作。

标签: .net roslyn


【解决方案1】:

您可以轻松地使用 Roslyn 将一个有效的 C# 代码重写为另一个有效的 C# 代码。但这并不意味着为语言添加扩展。

Roslyn 确实 也解析无效代码(如果您想在不完整的行上将它用于 IntelliSense,它必须解析),但由于它是无效的,因此不能保证它会正确执行(因为不清楚“正确”到底是什么意思)。另外,我认为它将用于infoof 的结构对您来说不是很方便。

总结一下:这不是 Roslyn 的本意,这样做可能是个坏主意。但我认为使用 Roslyn 来做到这一点并非不可能。

【讨论】:

  • 这不是它的本意,但我们很乐意看到你尝试一下。 :-) 而且,如果您明智地选择了语法,您仍然可以获得可以解析为有效 C# 的内容。例如,infoof(Foo) 将解析(虽然 不是 语义绑定)为调用表达式。
  • @JasonMalinowski 是的,我尝试了infoof(Foo(string)) 的更复杂的情况,它在语法上仍然是正确的,作为调用中的调用。你是对的,使用正确的语法,这样的东西可以可靠地工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多