如何检查方法是否在类型内被重写?反射C#
可能重复:如何检查方法是否在类型内被重写?反射C#,c#,reflection,overriding,C#,Reflection,Overriding,可能重复: 我需要运行特定的代码段,以确定特定类型是否覆盖对象.Equals 如何检查类型是否重写此方法 在VS中键入typeof(mytype).GetMethod(“Equals”)。为我提供了一个广泛的选项列表,但是没有“IsOverriden”之类的东西。检查DeclaringType是否是typeof(object)检查DeclaringType是否是typeof(object)有两种方法,首先,MethodInfo类有一个DeclaringType可以用来查看它是否是System.
我需要运行特定的代码段,以确定特定类型是否覆盖
对象.Equals
如何检查类型是否重写此方法
在VS中键入
typeof(mytype).GetMethod(“Equals”)。
为我提供了一个广泛的选项列表,但是没有“IsOverriden”之类的东西。检查DeclaringType
是否是typeof(object)
检查DeclaringType
是否是typeof(object)
有两种方法,首先,MethodInfo
类有一个DeclaringType
可以用来查看它是否是System.Object
。其次,您可以使用GetMethod
的重载来接受BindingFlags
枚举,并只传入DeclaredOnly
,以确保不获取任何父对象。有两种方法,第一种是MethodInfo
类有一个DeclaringType
可以用来查看它是否是System.Object
。其次,您可以使用GetMethod
的重载,该重载接受BindingFlags
枚举并传入DeclaredOnly
,以确保不获取任何父对象。您可以使用绑定标志:
var t = typeof(mytype).GetMethod(
"Equals",
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly
);
然后
t
不是null
当且仅当mytype
覆盖等于时,您可以使用绑定标志:
var t = typeof(mytype).GetMethod(
"Equals",
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly
);
然后t
不是null
当且仅当mytype
重写Equals
多态性的要点是,您不必关心类是否重写了Equals
之类的方法——如果它重写了,那么您相信它会做正确的事情。你想知道该类型是否重写了该方法,或者它的任何基类是否重写了该方法吗?@cHao he可能正在设计一个框架,对需要实现自定义Equals的类型使用反射。这在WPF中很常见。@Ani事实上,它听起来像是一个完全相同的副本,我应该删除它吗?我以前试过搜索,但似乎失败了。@cHao有一个很好的观点,你真的要检查这个吗?我想有一些合理的用例,但它们是罕见的,介于两者之间,也许有更好的方法来实现您想要做的事情?多态性的要点是,您不必关心类是否重写了方法,例如等于——如果是,那么您相信它会做正确的事情。你想知道该类型是否重写了该方法,或者它的任何基类是否重写了该方法吗?@cHao he可能正在设计一个框架,对需要实现自定义Equals的类型使用反射。这在WPF中很常见。@Ani事实上,它听起来像是一个完全相同的副本,我应该删除它吗?我以前试过搜索,但似乎失败了。@cHao有一个很好的观点,你真的要检查这个吗?我想有一些合理的用例,但它们非常罕见,介于两者之间,也许有更好的方法来实现您想要做的事情?是的,基本上检查GetMethodInfo返回的MethodInfo对象的DeclaringType,这一点毫无帮助:默认情况下,对象具有Equals(),但是知道它是否被重写并没有帮助。instance.GetType().GetMethod('MethodName')。DeclaringType应该有帮助,yes@Baboon:你确定吗?@狒狒:错了。被重写的Equals
的DeclaringType
将不会是对象
。是的,基本上检查GetMethod返回的MethodInfo对象的DeclaringType没有任何帮助:默认情况下,对象具有Equals(),但它不帮助知道它是否被重写。instance.GetType().GetMethod('MethodName')).DeclaringType应该有帮助,yes@Baboon:你确定吗?@狒狒:错了。被重写的Equals
的DeclaringType
将不会是对象
。您的代码甚至不适用于字符串
和大多数其他重写Equals的类型,因为它遇到了模糊匹配异常
,因为这些类型重载了Equals
。而且它也不考虑方法隐藏。检查Ani在副本上的答案,寻找一个实际有效的方法。您的代码甚至不适用于字符串
和大多数其他覆盖等于的类型,因为它遇到了一个模糊匹配异常
,因为这些类型重载了等于
。而且它也不考虑方法隐藏。检查Ani在复制件上的答案,以了解实际有效的方法。