Как переопределить метод Dispose, если dipposedValue является Private? - PullRequest
1 голос
/ 11 января 2010

Я должен добавить некоторый код Dispose в класс, который наследуется от класса, который уже реализует IDisposable, поэтому я попытался выполнить переопределение метода Dispose, но у меня нет доступного disposedValue, поскольку он объявлен как закрытый.

Как добавить новые операторы Dispose?

Protected Overridable Sub Dispose(ByVal disposing As Boolean)
    If Not disposedValue Then
        If disposing Then
           ''# ...
        End If
    End If
    disposedValue = True
End Sub

Заранее спасибо!

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я думаю, что я должен реализовать ту же логику, которая присутствует в базовом классе у наследника. Я прав?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я использую фрагмент, который Vb.Net автоматически пишет, когда вы объявляете, что класс реализует IDisposable.

Ответы [ 3 ]

2 голосов
/ 11 января 2010

Вы можете создать отдельное поле disposedValue в производном классе.
Тем не менее, вы, вероятно, должны назвать это isDisposed.

Обратите внимание, что все классы в FCL ничего не сделают, если вы дважды позвоните по номеру Dispose, поэтому нет ничего плохого в том, чтобы убрать эту логику и удалить несколько раз. Очевидно, это зависит от того, что вы делаете в Dispose; Вы должны проверить.

Обязательно позвоните MyBase.Dispose(disposing).

0 голосов
/ 11 января 2010

Ну, тот факт, что это частное, а не защищенное, вероятно, означает, что вы не должны этого делать. Но если вы настаиваете, вы можете использовать отражение. Да, это, вероятно, худший из возможных способов сделать это:

//(System.Reflection.BindingFlags...)
this.GetType().GetField("_privateVarName", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this);
0 голосов
/ 11 января 2010

Вместо того, чтобы пытаться дублировать логику базового класса, вызовите MyBase.Dispose (утилизацию).

...