给出了以下类结构:
public class A{
[MyAttribute1]
public string field;
}
public class B : A{
[MyAttribute2]
[MyAttribute3]
public string field;
}
通过反思现在我试图找出该字段是否具有属性“MyAttribute2”。 但我得到以下输出:
foreach (FieldInfo field in TypeOfB.GetFields(BindingFlags.Public | BindingFlags.Instance))
{
Console.Write(field.DeclaringType);
Console.Write(" : ");
Console.Write(field.GetCustomAttributes(false).Length);
Console.Write("\n");
}
//Output:
A.field : 1
B.field : 2
预期输出为:
B.field : 3
现在的问题。任何人都可以解释为什么我两次得到“场”但没有合并?最重要的是,谁能告诉我我是怎么做的?
答案 0 :(得分:1)
字段不能是虚拟/覆盖,您只隐藏了字段。您的代码相当于使用'new'关键字更明确地隐藏隐藏:
public class A
{
[MyAttribute1]
public string field;
}
public class B : A
{
[MyAttribute2]
[MyAttribute3]
public new string field;
}
属性(和方法)可以是虚拟/覆盖:
public class A
{
[MyAttribute1]
public virtual string field { get; set; }
}
public class B : A
{
[MyAttribute2]
[MyAttribute3]
public override string field { get; set; }
}
答案 1 :(得分:1)
小心点。该字段绝不会覆盖基类字段。它正在增加一个新的;这就是为什么你看到两个领域都是通过反思找到的。