C# 检查是否有一个";“类型”;重写动态类型

C# 检查是否有一个";“类型”;重写动态类型,c#,reflection,C#,Reflection,我们将一些重复性的工作交给一家咨询公司,我们只是有一些无法通过编译检查的约束,比如在实现特定接口的所有类中重写特定属性的要求 应在所有类中重写的接口属性具有以下签名: dynamic Definition{get;} 我发现这个问题: 这与我的案例无关,但在我的案例中,属性定义为继承类,并在此类中重写: public class ClassA:IMyInterface { public virtual dynamic Definition{get{ /*return SomethingS

我们将一些重复性的工作交给一家咨询公司,我们只是有一些无法通过编译检查的约束,比如在实现特定接口的所有类中重写特定属性的要求

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

dynamic Definition{get;}
我发现这个问题:

这与我的案例无关,但在我的案例中,属性定义为继承类,并在此类中重写:

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

这就是解决方案:您询问
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);

您可以找到仅在您的权益类型中声明的财产:

var prop = typeof (ClassB).GetProperty("Definition", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
然后,您可以检查其getter是否为虚拟的:

prop.GetMethod.IsVirtual

如果
Definition
ClassB

中隐藏(或使用
new
),则这将是
false
,您可以检查MemberAttributes,以确定是否设置了覆盖标志(我稍微编辑了它:
typeof(ClassB)。GetProperty(“Definition”)。DeclaringType==typeof(ClassB)
以便只知道当前的检查类。是否有任何方法对您指定的情况进行额外检查(
新的动态定义
)@Georg您提到的MemberAttributes在哪里?@Georg由三个类组成,其中ClassA为书面形式,ClassB为“new virtual”,ClassC为覆盖ClassB,您不能:-)@J4N如果有一个使用新虚拟的ClassB和一个覆盖ClassB的ClassC,这个解决方案就不会被愚弄,因为它会检查该方法是否是在接口中声明的方法