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 是,您可以尝试一下。
这也是您的自定义属性不执行任何操作的原因。
一般来说,属性中没有太多逻辑 - 它们通常只是简单的 标记。实现主要逻辑的是扫描这些属性的代码。
例如,下面的简单代码检测术语 "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 是,您可以尝试一下。
这也是您的自定义属性不执行任何操作的原因。
一般来说,属性中没有太多逻辑 - 它们通常只是简单的 标记。实现主要逻辑的是扫描这些属性的代码。