2011-09-21 26 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

相關問題