c# - C# 中的编译时反射

标签 c# .net compile-time strong-typing magic-string

我经常编写必须使用魔术字符串来表示属性名称的 C# 代码。每个人都知道魔术弦的问题。它们很难重构,没有编译时检查,而且通常会导致难以诊断的问题。然而,C#/.NET 到处都使用它们来表示属性/类/方法名称。

这个问题多年来一直存在,目前唯一可行的解​​决方案是使用表达式树,然后在运行时解析属性名称。这可以让您满意地进行编译时检查,但它会使代码复杂化(需要 Expression 类型的参数),并且它会产生运行时成本。

有谁知道 C#/.NET 是否考虑过添加编译时反射来克服这个普遍存在的问题的功能?

这看起来很容易添加,这将是一个非破坏性的更改,并且将使许多开发人员受益匪浅。 typeof() 运算符已经执行了一种编译时反射形式,因此看起来像一个运算符 nameof()(或类似的东西)会非常受欢迎。

此外,有人知道此类功能有任何潜在问题吗?

感谢您的帮助。

最佳答案

Straight from the source - 这是一篇 C# 语言设计者的博客文章,这篇文章中的“用户”提出了与您相同的问题并得到了回答。作者说,需要为您想要请求的每个元数据项指定一个语法,这不是微不足道的——即。如果你想要“info-of”方法并且该方法被重载,你想要哪个重载?如果涉及泛型和显式接口(interface)实现怎么办?等等。事实证明,虽然由于这些原因它在 2009 年被认为不值得实现,但我们将在 2015 年在 C# 6 中获得它 - 请参阅 C# Language Design Notes for Jul 9, 2014 .

关于c# - C# 中的编译时反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9335126/

相关文章:

C#:输入流不是有效的二进制格式

c# - 从控制台应用程序调用生成的 Web 测试代码

c# - 来自类库的引用不会复制到正在运行的项目 bin 文件夹

c++ - 为什么 std::array<T,N>::begin() 自 C++17 以来是 constexpr?

c++ - 在编译时确保 C++ 数组参数大小

c# - 如何使用 C# 将 Web 示例配置到 IIS Express 7.5 服务器中?

c# - Parallels.ForEach 与 Foreach 花费相同的时间

asp.net - 我应该将工作卸载到 ASP.NET 中的其他线程吗?

.net - 如何在 SQL 中调用标准 .NET 程序集

makefile - 让 CMake 声明一个目标虚假