例如,以下简单代码检测是否已定义术语“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;
}
内部如何运作?
答案 0 :(得分:2)
这是一个特殊属性,编译器知道。在编译时,编译器会解析您的方法并检查是否已定义此特定属性。要研究如何实现功能,你必须查看编译器的源代码 - 与VS2013捆绑在一起的Visual C#编译器不是开源的,但是Roslyn是,你可以尝试一下。
这也是您的自定义属性不执行任何操作的原因。
通常,属性中没有太多逻辑 - 它们通常只是简单的标记。它是扫描实现主逻辑的这些属性的代码。