Есть у меня некоторый обобщённый класс, который делает Request и отдаёт Response:
public class WebService
{
public TResponse Call<TRequest, TResponse>(TRequest request)
where TRequest : RequestBase
where TResponse : ResponseBase
{
...
}
}
public class ResponseBase
{
public int RemoteStatus { get; set; }
public bool Success
{
get { return this.RemoteStatus == SuccessStatusCode; }
}
public bool Fail
{
get { return this.RemoteStatus == FailedStatusCode; }
}
private const int SuccessStatusCode = 0;
private const int FailedStatusCode = -1;
}
И при одном из рефакторингов я решил использовать имевшийся фабричный метод:
public static ResponseBase Failed()
{
return new ResponseBase { RemoteStatus = FailedStatusCode };
}
И хотя такой код скомпилировался:
return (TResponse)ResponseBase.Failed();
но в рантайме упал с ошибкой приведения типа:
InvalidCastException: Не удалось привести тип объекта "ResponseBase" к типу "Response".
И я вот задумался: как наиболее простым способом у типа TResponse вызвать статический метод (добавлено: и как это будет соотноситься с отсутствием ограничения new())?
Я немного покопался с рефлексией (typeof(TResponse).GetType().GetMethods(BindingFlags.Static)), но оказалось что в рантайме информация о том, что TResponse = ResponseBase куда-то потерялась, уже typeof(TResponse) выдаёт
И добраться до .Failed() для того, чтобы дёрнуть MethodInfo.Invoke не получается.
Или это вообще тупиковое направление и я странного хочу? Я на текущий момент бросил эти попытки, добавив в ограничения , new() и прямо создав экземпляр класса TResponse -- но чисто академический интерес остался.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости