У меня есть общий интерфейс,
public interface ICalculator<in T>
{
void Calculate(T input);
}
общий калькулятор,
public class GeneralCalculator<T> : ICalculator<T>
{
public void Calculate(T input)
{
bla bla
}
}
специальный калькулятор, который работает только на некоторых типах,
public class SpecificAndFastCalculator<T> : ICalculator<T> where T : ISpecificInterface
{
public void Calculate(T input)
{
bla bla
}
}
и декоратор, который украшает ICalculator:
public class CalculatorDecorator<T> : ICalculator<T>
{
private readonly ICalculator<T> component;
public CalculatorDecorator()
{
component = (typeof (ISpecificInterface).IsAssignableFrom(typeof (T)))
? new SpecificAndFastCalculator<T>() //Compiler Error
: new GeneralCalculator<T>();
}
public void Calculate(T input)
{
component.Calculate(input); bla bla
}
}
Проблема, как вы видите, компилятор не принимает вызов конструктора SpecificAndFastCalculator , потому что он не знает, T подчиняется ограничению T: ISpecificInterface , хотя я проверяю его во время выполнения.Может ли компилятор быть прав, или он отклоняет код только потому, что он недостаточно умен?
Есть ли способ присвоить компонентному полю SpecificAndFastCalculator ?
Насколько я вижу, у меня есть следующие варианты:
- Написать специальный декоратор для наличия SpecificAndFastCalculator компонентов, который, я думаю, превосходит цель иметь декораторы,
- Как-нибудь использовать магию отражения (я понятия не имею, как)
- Удалить ограничение T: ISpecificInterface , документировать его и надеяться на лучшее.
Есть ли другой способ?На данный момент я выбираю третий вариант (удаление ограничения), что бы вы предложили?