リフレクションを使ってクラスにデストラクタがあるかどうかを調べようとしています。 System.Reflectionにコンストラクタを取得するメソッドがあります。 C#でクラスがカスタムデストラクタを定義しているかどうかを調べる方法はありますか?C#Reflection-クラスがデストラクタを定義しているかどうかを確認します
答えて
デストラクタ・メソッドが呼び出されるFinalize()
しているようです。すべてのオブジェクトがこれを持っているので、バインディングフラグDeclaredOnly
でそのオブジェクトを取得しようとすると、そのオブジェクトに明示的に定義されているかどうかを確認する必要があります。プライベートで非静的なので、他の2つのフラグも必要です。
myObj.GetMethod("Finalize",
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.DeclaredOnly)
オブジェクトに定義済みのデストラクタがない場合は、nullが返されます。
C#デストラクタは暗黙的にFinalize()を呼び出します。しかし、それは他のこともすることができます。 – jltrem
@jltrem Googleは私のためにタイムアウトしていたので、これはデストラクタのスタックトレースに基づいています。あなたが投稿した記事は、デストラクタ構文が暗黙的に基本クラス 'Finalize'メソッドも呼び出す' Finalize'メソッドの文法的砂糖であると言います。 – TheEvilPenguin
@ TheEvilPenguin質問のコメントで私が言っていることはまさに。それは "暗黙のうちにFinalize"を呼び出さず、ファイナライザに変換され、暗黙的に基本クラスのファイナライザを呼び出します。 –
問題のインスタンスで定義されているFinalizeの存在を確認してください。
は〜クラス名の構文は、オブジェクト上のFinalize()メソッドに変換されます。
すべての.NETオブジェクトには、System.Objectレベルで定義されたFinalizeメソッドがあります。
IDisposableを実装するクラスをお探しですか? – jcwrequests
ファイナライザはC#のみです。ファイナライザがあるタイプに存在するかどうかは分かりません(たとえ内部的に行っても)。ガベージコレクタだけが気にする必要があるかどうか気にしないでください。 –
@SimonWhitehead [C#でデストラクタ](http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx))(ファイナライズを呼び出す – jltrem