Как часть сборки библиотеки, у меня есть абстрактный класс SignalGenerator
, который реализует IDisposable
и имеет несколько подклассов. В этом абстрактном классе я поддерживаю экземпляры stati c каждого одноэлементного подкласса:
private static volatile Lazy<SignalGenerator> s_signalGenerator; // Default object instance if subclass not specified.
private static volatile Lazy<SignalGenerator> s_signalGeneratorSimulated;
private static volatile Lazy<SignalGenerator> s_signalGenerator79C3;
private static volatile Lazy<SignalGenerator> s_signalGenerator75C3;
private static volatile Lazy<SignalGenerator> s_signalGenerator41620;
У меня есть отдельная сборка, которая ссылается на этот класс и создает экземпляры подкласса, вызывая метод stati c SignalGenerator.GetInstance(className)
который создает экземпляр одной из указанных выше переменных класса на основе параметра className
.
Теперь проблема состоит в том, чтобы выяснить, какой подкласс следует удалить при вызове метода абстрактного класса Dispose()
:
using SignalGenerator s = SignalGenerator.GetInstance(nameof(P41620)); // P41620 is a subclass of SignalGenerator and corresponds to s_signalGenerator41620.
s.Dispose(); // How to tell abstract class which subclass to dispose of when Dispose doesn’t accept parameters?
Я думал, что понял это, добавив следующий метод к абстрактному классу и переопределив его в подклассах:
protected virtual void Dispose(bool disposing, [CallerFilePath] string subclassName = "")
Где CallerFilePath
можно было бы проанализировать, чтобы найти вызывающий имя подкласса. Но это работает, только если подкласс переопределяет этот метод Dispose, а не все.
Я понимаю, что все это имеет немного запаха кода, поэтому ищу лучшие решения.