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

时间:2013-07-16 19:41:02

标签: c# reflection system.reflection overwrite

给出了以下类结构:

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

现在的问题。任何人都可以解释为什么我两次得到“场”但没有合并?最重要的是,谁能告诉我我是怎么做的?

2 个答案:

答案 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)

小心点。该字段绝不会覆盖基类字段。它正在增加一个新的;这就是为什么你看到两个领域都是通过反思找到的。