如何检测当前类型是否具有“ToString”覆盖方法?

Sou*_*ter 4 c# reflection

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

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

System.Data.Entity.DynamicProxies.UserRole_D77A004638495805D68478322DF47F48540438D82DC9A5A0E1B0B2A181E4A100

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

在此处输入图片说明

谢谢,

Pet*_*ter 5

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

if (methodInfo.DeclaringType != typeof(YourObject)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

system.reflection.methodinfo


Joe*_*Joe 5

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

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

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


Ser*_*kov 3

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

首先,如果需要字符串表示,您可以使用一种方法添加额外的 mixin 接口,例如 IObjectDescriptor:string 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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