Я нахожусь в процессе создания фабричного метода, который использует общий параметр абстрактного типа для возврата экземпляра конкретного производного типа с использованием отражения. Например,
public abstract class ServiceClientBase : IServiceClient
{
}
public abstract class Channel : ServiceClientBase
{
}
public class ChannelImpl : Channel
{
}
public class ServiceClientFactory
{
public T GetService<T>() where T : class, IServiceClient
{
// Use reflection to create the derived type instance
T instance = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(string) }, null).Invoke(new object[] { endPointUrl }) as T;
}
}
Использование:
Channel channelService = factory.GetService<Channel>();
Проблема в том, что я не могу придумать какой-либо элегантный способ для фабричного метода создать экземпляр производного типа, которому передается абстрактный базовый тип в методе. Единственное, что я могу придумать, - это поддерживать словарь, содержащий карту между абстрактной базой и соответствующим производным классом, но мне это кажется запахом кода. Кто-нибудь может предложить лучшее решение.