我们正在向一家顾问公司提供一些重复的工作,我们只是有一些无法通过编译检查的约束,比如要求在实现特定接口的所有类中覆盖特定属性。
接口的属性应该在所有类中重写,具有以下签名:
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 :(得分: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
隐藏(或使用Definition
)new
,将为ClassB