Я думаю, что это невозможно без полного изменения архитектуры, но у меня есть классы (плагины), которые предоставляют настраиваемые параметры для пользователя во время выполнения.
Программа запускается, пользователь может выбрать использование различных плагинов, пользователь сталкивается с параметрами, которые они могут изменять для каждого плагина, пользователь нажимает кнопку воспроизведения, эти параметры конфигурации считываются, и мы отключаемся.
Когда пользователь выбирает, какие плагины он хочет использовать, создается экземпляр этого класса, чтобы он мог отображать доступные опции для этого плагина. Очевидно, что в нормальных условиях, когда классы являются экземплярами, передаются аргументы конструктора. В этом случае, если плагин имеет аргумент конструктора ILogger, а конкретный класс имеет аргумент конструктора DirectoryPath, но это доступно только для чтения, когда пользователь нажимает кнопку воспроизведения. мой контейнер МОК, чтобы передать это в?
public class MyPlugin
{
private ILogger Logger;
private Dictionary<string, object> Properties = new Dictionary<string, object>();
public MyPlugin(ILogger Logger)
{
this.Logger = Logger;
SetupProperties();
}
private SetupProperties()
{
Properties.Add("LogDirectory","Please enter a directory");
}
private void UserPressedPlay()
{
//We can now read the property values user has entered
//Now I want to instantiate FileLogger with the LogDirectory property
}
public DoSomething(string Data)
{
this.Logger.Write(Data);
}
}
public interface ILogger
{
void Write(string Data);
}
public FileLogger : ILogger
{
private string DirectoryPath;
public FileLogger(string Directory)
{
this.DirectoryPath = Directory;
}
public Write(string Data)
{
//Write to file
}
}