Просто выведите IControl<T>
из IControl
.
public interface IControl<T> : IControl
{
T Value { get; }
}
UPDATE
Если я вас неправильно понял, и вам не нужен неуниверсальный интерфейс, вам придется также сделать метод GetControl()
универсальным.
public IControl<T> GetControl<T>()
{
if (typeof(T) == typeof(Boolean))
{
return new BoolControl(); // Will not compile.
}
else if (typeof(T) == typeof(String))
{
return new StringControl(); // Will not compile.
}
else
{
return null;
}
}
Теперь у вас есть проблема, заключающаяся в том, что новые элементы управления не могут быть неявно приведены к IControl<T>
, и вам придется сделать это явным.
public IControl<T> GetControl<T>()
{
if (typeof(T) == typeof(Boolean))
{
return new (IControl<T>)BoolControl();
}
else if (typeof(T) == typeof(String))
{
return (IControl<T>)new StringControl();
}
else
{
return null;
}
}
UPDATE
Изменен состав актеров с as IControl<T>
на (IControl<T>)
. Это предпочтительнее, потому что это вызовет исключение, если есть ошибка, в то время как as IControl<T>
молча возвращает null
.