You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何将MediatR返回的TResponse转换为自定义泛型Response<T>

问题根源

强制转换失败的核心原因是:你当前上下文的泛型参数T和result实际类型Response<XXX>中的泛型参数不一定匹配,且TResponse没有和Response<T>做类型绑定,运行时无法直接完成强转。

解决方案

方案1:提取非泛型公共接口(最推荐,类型安全、性能无损耗)

你只需要将需要读取的Error、Message属性抽象到非泛型接口中,让泛型Response<T>实现该接口即可:
首先定义公共接口:

public interface IResponse
{
    bool Error { get; }
    string Message { get; }
}

修改你的泛型Response类实现该接口:

public class Response<T> : IResponse
{
    public Response(T data, string msg, bool error)
    {
        Data = data;
        Message = msg;
        Error = error;
    }

    public T Data { get; set; }
    public string Message { get; set; }
    public bool Error { get; set; }
}

之后在MediatR的管道逻辑中直接做类型判断转换即可,不需要关心泛型参数:

if (result is IResponse response)
{
    logMsg += $"Response status: {(response.Error ? "FAIL" : "OK")}" + Environment.NewLine;
    logMsg += $"Response message: {response.Message}" + Environment.NewLine;
}

如果所有请求的返回值都实现了IResponse,你还可以直接给管道类添加泛型约束,省掉类型判断:

public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
    where TRequest : IRequest<TResponse>
    where TResponse : IResponse
{
    // 管道逻辑中可以直接把result转为IResponse使用
}

方案2:反射读取属性(无需修改原有类定义)

如果你不能修改原有Response<T>的定义,可以通过反射动态读取属性:

var resultType = result.GetType();
// 校验是否为Response<>的泛型构造类型
if (resultType.IsGenericType && resultType.GetGenericTypeDefinition() == typeof(Response<>))
{
    bool error = (bool)resultType.GetProperty(nameof(Response<object>.Error)).GetValue(result);
    string message = (string)resultType.GetProperty(nameof(Response<object>.Message)).GetValue(result);
    
    logMsg += $"Response status: {(error ? "FAIL" : "OK")}" + Environment.NewLine;
    logMsg += $"Response message: {message}" + Environment.NewLine;
}

内容的提问来源于stack exchange,提问作者EnMiPcFunciona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 14:06:00