C# ConditionalAttribute 如何工作?

C# How does ConditionalAttribute work?

例如,下面的简单代码检测术语 "Test" 是否已定义,以确定我们是否应该 运行 函数。

[Conditional("Test")]
public static void print() {
    Console.WriteLine("Test_Conditional");
}

它在内部是如何工作的? 我找到了 ConditonalAttribute class

的源代码
[Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple=true)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class ConditionalAttribute : Attribute
{
    public ConditionalAttribute(String conditionString)
    {
        m_conditionString = conditionString;
    }

    public String ConditionString {
        get {
            return m_conditionString;
        }
    }

    private String m_conditionString;
}

这个class似乎对确定m_conditionString是否已经定义没有任何作用。我尝试创建自己的属性 class 与 ConditionalAttribute 相同,但它的工作方式与 ConditionalAttribute 不同。 这里是我自己的属性class(区别只是名字class)

[Serializable]
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple=true)]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class TestAttribute : Attribute
{
    public TestAttribute (String conditionString)
    {
        m_conditionString = conditionString;
    }

    public String ConditionString {
        get {
            return m_conditionString;
        }
    }

    private String m_conditionString;
}

它在内部是如何工作的?

这是一个编译器可以识别的特殊属性。在编译时,编译器解析您的方法并检查是否定义了该特定属性。要研究该功能是如何实现的,您必须查看编译器的源代码 - VS2013 附带的 Visual C# 编译器不是开源的,但 Roslyn 是,您可以尝试一下。

这也是您的自定义属性不执行任何操作的原因。

一般来说,属性中没有太多逻辑 - 它们通常只是简单的 标记。实现主要逻辑的是扫描这些属性的代码。