c# - 条件属性如何在幕后工作

标签 c# .net debugging conditional-statements custom-attributes

我们有这段代码:

public static class MyCLass 
{
    [Conditional("Debugging")]  
    public static void MyMethod()
    {
         Console.WriteLine("Example method");
    }
}
.
.
.
//In debug mode: Executing Main method in debug mode
MyClass.MyMethod()

我只想知道条件属性如何改变 MyMethod 的行为,假设在 .NET 中条件属性定义为:

public class Conditional: Attribute
{
   .
   .
   public string Mode { get; set; )
   .
   .
   public Conditional(string Mode)
   {
       .
       .
       this.Mode = Mode;
       if (Mode == "Debugging")
       {
          #ifdef DEBUG
          //HOW THE CONDITIONAL CONSTRUCTOR COULD CHANGE THE BEHAVIOUR OF MyMethod
          #endif
       }
       .
       .
   }
}

我如何访问由我的属性(即来自 MyAttribute 类)修饰的资源(方法、成员、类..)?

最佳答案

该属性告诉编译器查看标志是否已设置,如果未设置,则不会编译对该方法的任何调用,就好像代码中从未存在过该方法调用一样。您可以使用 ILSpy 等反射器工具轻松看到这一点。

所以实际上并不是属性改变了方法的行为,而是知道查找该属性并相应地改变其行为的编译器。

属性方法(在您的情况下为 MyMethod)仍处于编译状态,可以通过反射访问。

关于c# - 条件属性如何在幕后工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20782187/

相关文章:

c# - 基于属性的路由 VS 基于约定的路由 - ASP.net Core RESTful API 的最佳实践

c# - 当属性名称是关键字时访问动态对象的属性

.NET - 用于密集调试的第一次机会异常监听器?

node.js - 忽略调试器;调试 session 期间 Node.js 中的语句

C++ 标记化字符串不可取消引用

actionscript-3 - 从 FlashDevelop IDE 关闭 Flash Player

c# - 验证 WCF 和 WebService 方法参数值的最佳方式

c# - 自定义 MVC5 ASP.NET Identity 中的 cookie 值

.net - 如何使用 cron 执行 dotnet 应用程序?

c# - 无效的基本约束 : A certificate's basic constraint extension has not been observed