0

给出了以下类结构:

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

现在的问题。谁能解释为什么我两次获得“场”而不是合并?最重要的是,谁能告诉我我做得对吗?

4

2 回答 2

1

字段不能是虚拟的/覆盖的,您只隐藏了该字段。您的代码等效于使用“新”关键字来更明确地隐藏:

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; }
}
于 2013-07-16T19:43:34.577 回答
1

当心。该字段绝不会覆盖基类字段。它正在添加一个新的;这就是为什么您会看到通过反射找到这两个字段的原因。

于 2013-07-16T19:58:05.093 回答