2011-09-21 10 views
6

Próbuję rejestrować informacje o stanie niektórych obiektów i klas w moim kodzie. Nie wszystkie klasy lub biblioteki zostały wdrożone z serializacją. Używam Reflection on the Properties, aby napisać dokument XML stanu. Mam jednak wyzwanie polegające na tym, że niektóre obiekty, takie jak wbudowane klasy (tj. Łańcuchy znaków, data, czas itp.), Mają funkcję ToString, która w znaczący sposób drukuje wartość klasy. Ale dla innych klas wywołanie ToString używa odziedziczonej bazy ToString do wypluwania nazwy typu obiektu (na przykład słownik). W tym przypadku chcę rekurencyjnie zbadać właściwości wewnątrz tej klasy.Czy istnieje sposób stwierdzić, czy obiekt zaimplementował ToString jawnie w C#

Więc jeśli ktoś może mi pomóc z refleksją, aby dowiedzieć się, czy w obiekcie istnieje narzędzie ToString, na które patrzę, to nie jest metoda bazowa LUB wskazanie właściwego sposobu użycia GetValue do pobrania kolekcji właściwości, byłbym wdzięczny za to.

J

Odpowiedz

10

Aby ustalić, czy dana metoda jest przesłonięta czek MethodInfo.DeclaringType domyślny .ToString() tak:

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 { 
} 

Drukuje:

True 
False 
+0

Korzystanie BindingFlags.DeclaredOnly umożliwia testowanie go bezpośrednio. –

+2

Ale może istnieć nadpisanie odziedziczone po klasie bazowej innej niż obiekt. – phoog

+0

Dobrze. Sugestia Hansa Passanta, by szukać jedynie przesłonięć zadeklarowanych przez typ biegu obiektu, jest zatem niewystarczająca. – phoog

Powiązane problemy