检查“类型”是否覆盖动态类型

时间:2015-02-25 12:46:21

标签: c# reflection

我们正在向一家顾问公司提供一些重复的工作,我们只是有一些无法通过编译检查的约束,比如要求在实现特定接口的所有类中覆盖特定属性。

接口的属性应该在所有类中重写,具有以下签名:

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");

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您可以找到仅在您感兴趣的类型中声明的财产:

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

然后你可以检查它的getter是否是虚拟的:

prop.GetMethod.IsVirtual
如果false隐藏(或使用Definitionnew

将为ClassB