2013-07-16 2 views
0

дано является следующей структурой класса:Отражения переопределенного поля возвращает поле несколько раз

public class A{ 
    [MyAttribute1] 
    public string field; 
} 
public class B : A{ 
    [MyAttribute2] 
    [MyAttribute3] 
    public string field; 
} 

По Reflection теперь я пытаюсь выяснить, если поле имеет атрибут «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

Поля не могут быть виртуальными/переопределенными, у вас есть только скрытое поле. Ваш код эквивалентен использованию «новый» ключевое слово, чтобы быть более четко о бегах:

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

Будьте осторожны. Это поле никоим образом не переопределяет поле базового класса. Это добавление нового; поэтому вы видите, что оба поля находятся при отражении.

Смежные вопросы