【问题标题】:Is there a way to tell if an object has implemented ToString explicitly in c#有没有办法判断一个对象是否在 c# 中显式实现了 ToString
【发布时间】:2011-11-22 09:13:34
【问题描述】:

我正在尝试在我的代码中记录有关某些对象和类的状态的信息。并非所有的类或库都是用序列化实现的。所以我在属性上使用反射来写出状态的 XML 文档。但是,我面临的挑战是,像内置类(即字符串、日期时间、数字等)这样的一些对象有一个 ToString 函数,它以一种有意义的方式打印出类的值。但对于其他类,调用 ToString 只是使用继承的基 ToString 来吐出对象类型的名称(例如 Dictionary)。在这种情况下,我想递归地检查该类中的属性。

因此,如果有人可以帮助我进行反思,以确定是否在我正在查看的属性上实现了 ToString,这不是基本方法,或者指出使用 GetValue 检索集合属性的正确方法我会很感激的。

J

【问题讨论】:

    标签: c# serialization reflection properties


    【解决方案1】:

    要确定一个方法是否覆盖了默认的.ToString(),请检查MethodInfo.DeclaringType,如下所示:

    void Main()
    {
        Console.WriteLine(typeof(MyClass).GetMethod("ToString").DeclaringType != typeof(object));
        Console.WriteLine(typeof(MyOtherClass).GetMethod("ToString").DeclaringType != typeof(object));
    }
    
    class MyClass 
    {
        public override string ToString() { return ""; }
    }
    
    class MyOtherClass {
    }
    

    打印出来:

    True
    False
    

    【讨论】:

    • 使用 BindingFlags.DeclaredOnly 可以直接测试它。
    • 但是可能存在从对象以外的基类继承的覆盖。
    • 对。因此,Hans Passant 建议仅查找由对象的运行时类型声明的覆盖。
    • 大部分内置对象都有多个 ToString 方法。所以我不得不修改示例以使用以下 GetMethod 参数:GetMethod("ToString", System.Type.EmptyTypes)
    • 当需要检测结构上的 ToString 覆盖时,也可以与 typeof(ValueType) 进行比较。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2011-07-24
    • 2013-09-04
    • 2020-08-07
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多