2013-07-16 32 views
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 

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

回答

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

但覆盖工程..只有我的反射问题存在 – Floyd

+0

编辑后..好吧我明白 – Floyd

1

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