2015-02-25 2 views
1

. Мы предоставляем некоторые повторяющиеся задания для консалтинговой компании. У нас есть только несколько ограничений, которые невозможно проверить путем компиляции, например, требование переопределить определенное свойство во всех реализациях класса конкретный интерфейс.Проверьте, что «Тип» переопределяет динамический тип.

Свойство интерфейса, который должен быть перекрытым во всех классах имеет следующую подпись:

dynamic Definition{get;} 

я нашел этот StackOverflow вопрос: How to find out if property is inherited from a base class or declared in derived?

который закрыт на мой случай, но в моем случай, свойство определяется наследуется класс и перекрытая в этом одном:

public class ClassA:IMyInterface 
{ 
    public virtual dynamic Definition{get{ /*return SomethingSpecificToClassA;*/}} 
} 

public class ClassB:ClassA 
{ 
    public override dynamic Definition{get{ /*return SomethingSpecificToClassB;*/}} 
} 

//The end goal is to know if ClassB has correctly overriden the property 
bool overriden = typeof(ClassB)GetProperties(...).Any(p=>p.Name=="Definition"); 

ответ

0

Вы можете найти на имущество объявляться только в вашем типе интересов:

var prop = typeof (ClassB).GetProperty("Definition", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); 

Затем вы можете проверить, если его добытчик виртуальна:

prop.GetMethod.IsVirtual 

который будет false если Definition шкуры (или использует new) в ClassB

1

Это решение: вы спросите ClassB его интерфейсную карту, вы ищете метод, который вы хотите на карте интерфейса, и затем вы посмотрите, где объявлен метод реализации (classMethod).

var interfaceMethod = typeof(I).GetProperty("Definition").GetGetMethod(); 
var map = typeof(ClassB).GetInterfaceMap(typeof(I)); 
var ix = Array.IndexOf(map.InterfaceMethods, interfaceMethod); 
var classMethod = map.TargetMethods[ix]; 
bool isDeclaredInClass = classMethod.DeclaringType == typeof(ClassB); 
+0

Yo u может проверить MemberAttributes, если установлен флаг переопределения – Georg

+0

Хороший способ сделать это (я слегка отредактировал его: 'typeof (ClassB) .GetProperty (« Определение »). DeclaringType == typeof (ClassB)', чтобы знать только текущий класс проверки. Любой способ сделать дополнительную проверку для указанного вами случая ('new dynamic Definition') – J4N

+0

@Georg Где вы упомянули этот MemberAttributes? – J4N

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