C#ConditionalAttribute是如何工作的?

时间:2015-04-22 08:30:42

标签: c# attributes

例如,以下简单代码检测是否已定义术语“Test”,以确定是否应运行该函数。

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

内部如何运作? 我找到了ConditonalAttribute类的源代码

[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;
}

这个类似乎无法确定是否已定义m_conditionString。我尝试创建自己的属性类与ConditionalAttribute相同,但它不像ConditionalAttribute那样工作。 这是我自己的属性类(区别只是类的名称)

[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;
}

内部如何运作?

1 个答案:

答案 0 :(得分:2)

这是一个特殊属性,编译器知道。在编译时,编译器会解析您的方法并检查是否已定义此特定属性。要研究如何实现功能,你必须查看编译器的源代码 - 与VS2013捆绑在一起的Visual C#编译器不是开源的,但是Roslyn是,你可以尝试一下。

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

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