重写字段的反射会多次返回该字段



给出的是以下类结构:

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

小心。该字段决不会覆盖基类字段。它正在添加一个新的;这就是为什么你看到两个场都是通过反射找到的。

最新更新