Предположим, у вас есть такой интерфейс:
public interface IDoSomething<out T>
{
T DoSomething(object value);
}
Чтобы иметь возможность вызвать DoSomething
на этом интерфейсе, не зная типа T
, вы должны создать это:
public interface IDoSomething
{
object DoSomething(object value);
}
Измените свой оригинальный интерфейс для наследования от нового:
public interface IDoSomething<out T> : IDoSomething
{
new T DoSomething(object value);
}
А затем сделайте это:
((IDoSomething)obj).DoSomething();
'' 'Но' '' тогда вы должны реализовать метод DoSomething
в своей реализации дважды; один раз явно и один раз неявно.
Одно из решений, которое частично работает, заключается в следующем:
((IDoSomething<object>)obj).DoSomething();
Но это работает, только если универсальный тип является ссылочным типом; Типы значений типа DateTime
и int
не будут работать, даже если они тоже наследуются от object
. Почему это?!
Есть ли решение этой загадки (без использования абстрактных классов!)?