2011-09-21 31 views
6

我想记录有关我的代码中的一些对象和类的状态的信息。并非所有类或库都使用序列化来实现。所以我在Properties上使用Reflection来写出一个状态的XML文档。然而,我有一个挑战,像内置类(即字符串,日期时间,数字等)的一些对象有一个ToString函数,以有意义的方式打印出类的值。但对于其他类,调用ToString只是使用继承的基ToString来吐出对象类型的名称(例如字典)。在这种情况下,我想递归检查该类中的属性。有没有办法告诉如果一个对象已明确在C#中实现ToString

所以,如果任何人都可以帮我反思,要么找出是否有一个ToString实现属性我看,这不是基本的方法或指出正确的方式使用GetValue检索集合属性我将不胜感激。

Ĵ

回答

10

要确定一个方法是否覆盖默认.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 
+0

使用BindingFlags.DeclaredOnly,您可以直接对其进行测试。 –

+2

但是可能有一个覆盖从对象以外的基类继承。 – phoog

+0

没错。而Hans Passant的建议是只查看由对象的运行时类型声明的覆盖,因此不足。 – phoog

相关问题