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
Antwort
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.
Ein C# -Destruktor ruft implizit Finalize() auf. Aber es könnte auch andere Dinge tun. – jltrem
@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
@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. –
Ü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.
- 1. Java Reflection: Erstellen Sie eine implementierende Klasse
- 2. C# Reflection kann keine NUnit-Attribute finden
- 3. SIGSEGV auf Klasse Destruktor
- 4. Return Klasse Destruktor
- 5. Reflection: Klasse nicht existiert
- 6. Destruktor in Objective-C++
- 7. Finden Sie heraus, ob eine Objective-C-Klasse eine Methode überschreibt
- 8. .NET Reflection: Hier finden Sie gebrauchte Typen
- 9. Destruktor einer Klasse C mit Mitgliedern der Zeiger C
- 10. Destruktor in C#
- 11. Reflection, Klasse existiert nicht
- 12. C++ Template-Grundprogramm, Linker kann nicht und Destruktor finden
- 13. C#, Internal und Reflection
- 14. Testen Sie, ob eine Klasse polymorph ist
- 15. Freigabe Speicher, statische Klasse Destruktor?
- 16. Invoke Super-Klasse Methoden Reflection
- 17. C++ DLL Unload Destruktor?
- 18. Finden einer Aufzählungsklasse mit Reflection in Java
- 19. Wie finden Sie heraus, ob ein Steuerelement von einer Klasse
- 20. C# Reflection - GetMethod
- 21. Finden Sie alle Links * ohne * eine Klasse
- 22. Reflection & Parameters in C#
- 23. Überprüfen Sie, ob eine Klasse existiert
- 24. Virtueller Destruktor C++
- 25. C++ Konstruktor/Destruktor
- 26. So finden Sie, ob das Objekt einer Klasse existiert
- 27. Finden, ob das Feld eine Klasse mit in JQuery benötigt
- 28. C# - Rekursive/Reflection-Eigenschaftswerte
- 29. Verwenden Sie die neue Reflection-API, um den primären Konstruktor einer Klasse zu finden?
- 30. Reflection C# - Wie man Griff zu Klasse mehrere Eigenschaften tief
Suchen Sie nach Klassen, die IDisposable implementieren? – jcwrequests
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. –
@SimonWhitehead [Destruktoren in C#] (http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx) Call Finalize() – jltrem