And*_*rey 56 c# reflection overriding
假设我有一个基类TestBase,我定义了一个虚拟方法TestMe()
class TestBase
{
public virtual bool TestMe() { }
}
Run Code Online (Sandbox Code Playgroud)
现在我继承了这个类:
class Test1 : TestBase
{
public override bool TestMe() {}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用Reflection,我需要找出TestMe方法是否已在子类中重写 - 是否可能?
我需要它 - 我正在为类型"object"编写一个设计器可视化器来显示整个继承层次结构,并显示在哪个级别覆盖了哪些虚拟方法.
Rex*_*x M 64
给定类型Test1,您可以确定它是否有自己的实现声明TestMe:
typeof(Test1).GetMethod("TestMe").DeclaringType == typeof(Test1)
Run Code Online (Sandbox Code Playgroud)
如果声明来自基类型,则会评估为false.
请注意,由于这是测试声明,而不是真正的实现,如果它也是抽象的并且是抽象的,则返回true ,因为它具有自己的声明.如果要排除该情况,请添加Test1TestMeTest1&& !GetMethod("TestMe").IsAbstract
Ken*_*ett 21
正如@CiprianBortos指出的那样,接受的答案并不完整,如果您按原样使用它,将导致代码中出现令人讨厌的错误.
他的评论提供了神奇的解决方案GetBaseDefinition(),但是没有必要检查DeclaringType你是否想要进行通用IsOverride检查(我认为这是这个问题的重点),只是methodInfo.GetBaseDefinition() != methodInfo.
或者,作为扩展方法提供MethodInfo,我认为这将做到这一点:
public static class MethodInfoUtil
{
public static bool IsOverride(this MethodInfo methodInfo)
{
return (methodInfo.GetBaseDefinition() != methodInfo);
}
}
Run Code Online (Sandbox Code Playgroud)
ESV*_*ESV 18
我无法让Ken Beckett建议的解决方案起作用.这就是我所确定的:
public static bool IsOverride(MethodInfo m) {
return m.GetBaseDefinition().DeclaringType != m.DeclaringType;
}
Run Code Online (Sandbox Code Playgroud)
要点中有测试.
一个简单的解决方案也适用于受保护的成员和属性如下:
var isDerived = typeof(Test1 ).GetMember("TestMe",
BindingFlags.NonPublic
| BindingFlags.Instance
| BindingFlags.DeclaredOnly).Length == 0;
Run Code Online (Sandbox Code Playgroud)
这是我在这里的答案的转贴,反过来又引用了这个问题.
| 归档时间: |
|
| 查看次数: |
19388 次 |
| 最近记录: |