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:它硬编码到编译器中。