可能的重复:
如何确定 MethodInfo 是否覆盖了基本方法
通常,当我们执行任何复杂类型的“ToString”方法时,它会返回当前类型名称,如以下字符串,除了“ToString”覆盖方法。
System.Data.Entity.DynamicProxies.UserRole_D77A004638495805D68478322DF47F48540438D82DC9A5A0E1B0B2A181E4A100
我想要一些逻辑来检测有关此的当前类型,因为我尝试将数据导出为 excel 格式。但是模型的某些属性是没有定义“ToString”方法的复杂类型。此属性的输出对于普通用户是无用的。

谢谢,
您可以检查 to string 的 methodInfo 上的 DeclaringType
if (methodInfo.DeclaringType != typeof(YourObject)) {
...
}
Run Code Online (Sandbox Code Playgroud)
你当然可以通过反射来做到这一点。另一种可能为您提供您想要的并且不使用反射的方法是:
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()。
我认为这种检查特定类型是否覆盖 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)
在这两种情况下,您的意图以及您和客户之间的“合同”都会更加明确。在第一种情况下,如果类型未实现特定接口,您将引发异常,而使用第二种方法,您将至少获得一致的行为。