4

可能重复:
如何确定 MethodInfo 是否是基方法的覆盖

通常,当我们执行任何复杂类型的“ToString”方法时,它将返回当前类型名称,如下面的字符串,除了有“ToString”覆盖的方法。

System.Data.Entity.DynamicProxies.UserRole_D77A004638495805D68478322DF47F48540438D82DC9A5A0E1B0B2A181E4A100

我想要一些逻辑来检测当前类型,因为我尝试将数据导出为 excel 格式。但是模型的某些属性是复杂类型,没有定义“ToString”方法。此属性的输出对普通用户无用。

在此处输入图像描述

谢谢,

4

4 回答 4

5

您可以在 to string 的 methodInfo 上检查 DeclaringType

if (methodInfo.DeclaringType != typeof(YourObject)) {
    ...
}

system.reflection.methodinfo

于 2012-11-26T08:26:24.757 回答
5

你当然可以通过反射来做到这一点。另一种可能为您提供所需且不使用反射的方法是:

if (this.ToString() != this.GetType().ToString())
{
    // This Type or one of its base types has overridden object.ToString()
}

请注意,您可能想要检查当前类型或任何基本类型(对象除外)是否已被覆盖ToString()。作为一个人为的例子,所有派生自的类型都Exception返回一个合理的值ToString()(异常详细信息包括堆栈跟踪),但不是所有的 override Exception.ToString()

于 2012-11-26T08:29:34.247 回答
3

我认为这种检查特定类型是否覆盖 ToString 的方法有点脆弱。我们可以通过其他几种方式解决这个问题。

首先,如果需要字符串表示,您可以使用一种方法添加额外的混合接口,如 IObjectDescriptor:字符串 GetDescription。并且您可以要求每种类型都实现此功能(如果未实现类,则会引发异常)。

第二种方法(如果我们不想更改现有的代码库)是使用单独的帮助类,它将有一个方法:ConvertToString:

static class ToStringHelper
{
  // We can use Generic method to prevent boxing
  public string ConvertToString(object o)
  {
    var sb = new StringBuilder();
    // using reflection to access all public properties, for example

    return sb.ToString();
  }
}

在这两种情况下,您与客户之间的意图和“合同”都会更加清晰。在第一种情况下,如果类型未实现特定接口,您将抛出异常,使用第二种方法,您将获得至少一致的行为。

于 2012-11-26T08:26:56.600 回答
1

您可以使用IsSubclassOf对象和DeclaringType方法。

public class BaseClass
{
    public string Name;

    public virtual void Write(string val)
    {
    }
}

public class SubClass : BaseClass
{
    public string Address;

    public override void Write(string val)
    {
        base.Write(val);
    }
}

测试代码:

Type objType = obj.GetType();
MethodInfo info = objType.GetMethod("Write");
if (objType.IsSubclassOf(info.DeclaringType))
{

    Console.WriteLine("Not Override");
}
else
    Console.WriteLine("Override");
于 2012-11-26T09:39:26.567 回答