Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 条件属性在幕后的工作方式_C#_.net_Debugging_Conditional_Custom Attributes - Fatal编程技术网

C# 条件属性在幕后的工作方式

C# 条件属性在幕后的工作方式,c#,.net,debugging,conditional,custom-attributes,C#,.net,Debugging,Conditional,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() 我只想知

我们有以下代码:

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
在您的例子中)仍然被编译,并且可以通过反射来访问。

属性告诉编译器是否设置了标志,因此如果没有设置,则不会编译对该方法的任何调用,就像代码中不存在方法调用一样。通过使用诸如ILSpy之类的反射器工具,您可以很容易地看到这一点

因此,事实上,不是属性改变了方法的行为,而是编译器知道如何查找该属性并相应地改变其行为


属性化方法(
MyMethod
,在您的例子中)仍在编译中,可以通过反射访问。

Spoiler:它硬编码到编译器中。Spoiler:它硬编码到编译器中。