给出的是以下类结构:
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
现在是问题。有人能解释为什么我得到两次"字段"而没有组合吗?最重要的是,谁能告诉我我做得对?
字段不能是虚拟的/覆盖的,您只隐藏了字段。你的代码相当于使用"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; }
}
小心。该字段决不会覆盖基类字段。它正在添加一个新的;这就是为什么你看到两个场都是通过反射找到的。