Я редактировал свой пост, но он стал таким длинным, что я решил, что это почти ответ на мою проблему.
Мне удалось выделить проблему в следующей строке:
var f = Result.Fail(error).ToResult<CustomClass>() as TResponse;
return f;
Если я жестко ссылаюсь на класс, который передаю в Result, тогда преобразование работает должным образом, и все работает так, как должно. Теперь возникает вопрос: как я могу получить ссылку на класс, которую я могу передать в .ToResult<T>()
только из TResponse?
Я искал ответ, но, похоже, принципиально невозможно получить компиляцию ссылка на класс времени, во время выполнения, когда мне это понадобится во время компиляции.
Я также попытался создать копию объекта результата и вернуть его после добавления ошибок проверки. Примерно так:
var resultType = typeof(TResponse).GetGenericArguments()[0];
var invalidResponseType = typeof(ValidateableResponse<>).MakeGenericType(resultType);
var f = Activator.CreateInstance(invalidResponseType, null) as TResponse;
return f;
Это будет работать, но объект Result имеет закрытый конструктор, и поэтому я остался с исключением. Я оставил проблему на GitHub или FluentResult, и, возможно, ее можно изменить. *
Пример использования:
// At the top of my handle function
var result = await ValidateAsync<GetItemByIdQuery, GetItemByIdQueryValidator>(request);
if (result.IsFailed) return result;
Это тоже работает, единственным недостатком является то, что я должен добавлять это вверху каждой функции Handle, чтобы включить проверку.
Для теперь все в порядке, я подожду и посмотрю, можно ли обновить пакет FluentResult, чтобы попробовать ранее высказанное предложение.
Спасибо всем за предложения!