2013-10-24 9 views
6

definiert habe Ich versuche zu finden, ob eine Klasse Destruktoren mit Reflektion hat. Ich sehe Methoden zum Abrufen von Konstruktoren in System.Reflection. Gibt es eine Möglichkeit zu finden, ob eine Klasse benutzerdefinierte Destruktoren in C# definiert hat?C# Reflection - Finden Sie, ob eine Klasse Destruktor

+0

Suchen Sie nach Klassen, die IDisposable implementieren? – jcwrequests

+2

Es gibt nur Finalizer in C#. Ich sehe nicht den Sinn zu wissen, ob ein Finalizer auf einem Typ existiert (obwohl sie es intern sowieso machen) .. weil es dir egal sein sollte, wenn es so ist .. nur der Garbage Collector sollte sich darum kümmern. –

+0

@SimonWhitehead [Destruktoren in C#] (http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx) Call Finalize() – jltrem

Antwort

7

Die Destruktor-Methode scheint Finalize() genannt zu werden. Alle Objekte haben dies, also möchten Sie überprüfen, ob es explizit für dieses Objekt definiert ist, indem Sie versuchen, es mit dem Bindungsflag DeclaredOnly zu erhalten. Es ist auch privat und nicht statisch, also brauchen Sie auch die anderen beiden Flaggen.

myObj.GetMethod("Finalize", 
       BindingFlags.NonPublic | 
       BindingFlags.Instance | 
       BindingFlags.DeclaredOnly) 

Dies gibt null zurück, wenn das Objekt keinen definierten Destruktor hat.

+1

Ein C# -Destruktor ruft implizit Finalize() auf. Aber es könnte auch andere Dinge tun. – jltrem

+1

@jltrem Google hat sich für mich entschieden, also habe ich das auf Basis eines Stack-Traces von Destruktor gesagt. Der von Ihnen gepostete Artikel scheint zu sagen, dass die Destruktor-Syntax syntaktischer Zucker für eine 'Finalize'-Methode ist, die implizit auch die 'Finalize'-Methode der Basisklasse aufruft. – TheEvilPenguin

+2

@TheEvilPenguin Genau das, was ich in den Kommentaren zu der Frage sage. "Finalize" wird nicht implizit aufgerufen. Es wird in einen Finalizer konvertiert und ruft implizit den Finalizer der Basisklasse auf. –

1

Überprüfen Sie die Reflektion auf die Existenz von Finalize, die für die fragliche Instanz definiert ist.

Die ~ ClassName-Syntax wird in eine Finalize() - Methode für das Objekt übersetzt.

Alle .NET-Objekte verfügen über eine Finalize-Methode, die auf der System.Object-Ebene definiert ist.