Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查方法是否在类型内被重写?反射C#_C#_Reflection_Overriding - Fatal编程技术网

如何检查方法是否在类型内被重写?反射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在复制件上的答案,以了解实际有效的方法。