2013-07-16 71 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

要小心。該字段絕不會覆蓋基類字段。它增加了一個新的;這就是爲什麼你看到通過反射找到兩個領域。