我想确定从类型实例的GetMethod调用中获取的MethodInfo对象是由类型本身还是它的基类实现的。
例如:
Foo foo = new Foo();
MethodInfo methodInfo = foo.GetType().GetMethod("ToString",BindingFlags|Instance);
ToString方法可能在Foo类中实现,也可能没有。我想知道我是否得到了foo的实现?
相关问题
我想确定从类型实例的GetMethod调用中获取的MethodInfo对象是由类型本身还是它的基类实现的。
例如:
Foo foo = new Foo();
MethodInfo methodInfo = foo.GetType().GetMethod("ToString",BindingFlags|Instance);
ToString方法可能在Foo类中实现,也可能没有。我想知道我是否得到了foo的实现?
相关问题
检查它的DeclaringType
属性。
if (methodInfo.DeclaringType == typeof(Foo)) {
// ...
}
不要使用反射,而是使用委托会更快!尤其是在新版本的框架中,操作非常迅速。
public delegate string ToStringDelegate();
public static bool OverridesToString(object instance)
{
if (instance != null)
{
ToStringDelegate func = instance.ToString;
return (func.Method.DeclaringType == instance.GetType());
}
return false;
}
MemberInfo
对象的DeclaringType
属性(实际上是获取声明此成员的类)是否等于ReflectedType
属性(该属性获取用于获取此MemberInfo
实例的类对象)。IsAbstract
。 如果它为true
,则检查的方法绝对没有被重写,因为“抽象”意味着该成员是一个新声明,在当前类中不能有其实现(即“体”),而只能在派生类中存在。Student student = new Student
{
FirstName = "Petter",
LastName = "Parker"
};
bool isOverridden = student.GetType()
.GetMethod(
name: nameof(ToString),
bindingAttr: BindingFlags.Instance | BindingFlags.Public,
binder: null,
types: Type.EmptyTypes,
modifiers: null
).IsOverridden(); // ExtMethod
if (isOverridden)
{
Console.Out.WriteLine(student);
}
using System.Reflection;
public static class MethodInfoHelper
{
/// <summary>
/// Detects whether the given method is overridden.
/// </summary>
/// <param name="methodInfo">The method to inspect.</param>
/// <returns><see langword="true" /> if method is overridden, otherwise <see langword="false" /></returns>
public static bool IsOverridden(this MethodInfo methodInfo)
{
return methodInfo.DeclaringType == methodInfo.ReflectedType
&& !methodInfo.IsAbstract;
}
}
abstract override
。 - jnm2Animal
覆盖了ToString()
,然后Mammal
有一个abstract override
的ToString()
。换句话说,Mammal
重新抽象化了该方法,要求其具体子类型在某个时候重新实现它。从Mammal
的角度来看,我们会认为该方法被覆盖了吗?当然,这取决于我们的定义。我们可以肯定地说一件事情,那就是该方法与_原始_实现(恰好是Object.ToString()
)相比肯定被覆盖了。 - Timo