gpt4 book ai didi

C#:编写 MSIL 以添加预处理器指令

转载 作者:太空狗 更新时间:2023-10-29 18:19:31 25 4
gpt4 key购买 nike

是否可以在 C# 中编写 MSIL 代码,在满足特定条件时向代码添加预处理器指令,例如 #warning?或者也许这可以通过反射(reflection)来完成,我不知道。

我正在尝试编写一个自定义属性,如果错误地应用于类的方法或属性,将生成编译器警告。使用现有的 Obsolete 属性将不起作用,因为仅使用我的自定义属性会导致警告,而我不希望这样。我希望自定义属性构造函数检查条件,如果该条件为真,则引发编译警告。

更新:在回顾我的问题后,我认为我所要求的是不可能的,因为我混合了编译时和运行时约束。我想我最终会执行构建后任务来检查刚刚构建的 DLL 并让它在条件为真时吐出错误消息。

最佳答案

我看到这个问题来自您之前的话题。错误引用伟大的 Jamie Zawinski 的话:“有些人在遇到问题时会想“我知道,我会使用属性。现在他们有两个问题”。

属性只是带外数据,编译到程序集的元数据中。它不会影响程序执行或工具行为,除非程序或工具被明确编程为识别特定属性。它需要使用反射来做到这一点。

您需要做的是编写自己的工具。它应该在构建程序集后执行,使用项目的构建后步骤。它需要加载程序集并使用反射来迭代程序集中的类型。对于每种类型,使用 Type.GetMethods() 迭代方法并使用 MethodInfo.GetCustomAttributes() 来发现和构建可能已编程的属性。

您可以使用 Type.GetInterfaces() 来发现该类型实现了哪些接口(interface)。当您看到存在实现接口(interface)方法但缺少说明如此的属性的方法时,您现在可以提示。你的最终目标是:当你看到一个方法的属性表明它实现了一个接口(interface)方法但类型不再继承它时,你可以提示。

如果您发现任何令人反感的内容,请使用 Environment.ExitCode 使该工具无法构建。这负责执行。顺便说一句:程序员真的很讨厌破坏构建。这很可能会鼓励他们虔诚地使用该属性。或者它可能会鼓励他们编辑后期构建步骤。

关于C#:编写 MSIL 以添加预处理器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2169161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com