Приведение типов в дженериках

62
08 октября 2021, 18:30

Есть у меня некоторый обобщённый класс, который делает 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 -- но чисто академический интерес остался.

READ ALSO
Как добавить все namespace для Unit-теста?

Как добавить все namespace для Unit-теста?

Как добавить namespace TestApp, TestAppController, TestApp

76
Повторное выполнение SQL запроса

Повторное выполнение SQL запроса

Есть веб приложение на PHP + БД на MySQLПосле выполнения какого-либо SQL запроса путем отправки данных через HTML форму, если обновить страницу, то SQL запрос...

94
Как сделать динамические мета-теги?

Как сделать динамические мета-теги?

Есть сайт в формате siteru, есть алиас домена krd

67
Как создать multiple insert в базу данных?

Как создать multiple insert в базу данных?

Есть многофайловая загрузка изображений, но в БД создается только одна строка!

86