Хммм, хорошо, в зависимости от того, что вы ищете, это либо довольно просто, либо невероятно сложно.
Вы ищете фабрику для класса args ?Если это так, у вас будет трудное время - поскольку у них всех есть разные свойства, которые вы должны заполнить.Вам не нужен глобальный конструктор фабрики, который принимает каждое возможное имя поля и решает, какой тип использовать, основываясь на том, какие значения были заполнены.
Но ... если вы просто ищете конструктор дляИТ-транспорт?Тогда вы можете просто сделать:
public class Factory
{
public static ITransport CreateTransport(TransportConnectionArgs args)
{
if (args is SshTransportConnectionArgs)
return new SshDebugClient((SshTransportConnectionArgs)args);
if (args is SerialTransportConnectionArgs)
return new SerialDebugClient((SerialTransportConnectionArgs)args);
// etc
}
}
... или, если вы действительно против тех, если линии?
Используйте отражение, чтобы найти все неабстрактные классы, которые реализуют ITransport, добавляют в ITransport дополнительный метод, требующий, чтобы разработчики возвращали тип аргументов, с которыми они работают, и затем делают что-то вроде:
public static ITransport CreateTransport(TransportConnectionArgs args)
{
List<ITransport> allTranports = GetAllImplementersOf<ITransport>();
foreach(ITransport transport in allTransports)
{
if (transport.NeededArgType == typeof(args))
return transport;
}
}
... В конечном счете, хотя, я думаю,одна проблема в том, что между двумя вашими классами нет «крючка».У вас есть транспортный тип, и у вас есть тип аргумента ... но у вас нет никакой связи между ними.Часть меня задается вопросом, должны ли вы иметь аргументы, которые транспорт может создавать / анализировать, вместо того, чтобы иметь отдельный независимый класс для него.