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

C# 如何简化MVC命令调度泛型方法调用,省略重复泛型参数

可以实现,C#本身不支持部分泛型参数推断,你可以通过以下两种方案达到只传命令类型的调用效果:

方案1:单泛型参数入口 + 内部反射解析

你可以新增一个只接收TCommand泛型参数的重载方法,内部通过反射解析命令类型关联的参数类型,自动调用原双泛型参数方法。

首先建议补充定义一个非泛型的基础命令接口(可选,用于统一返回值类型):

// 新增非泛型基础接口
public interface IMVCCommand
{
    // 可定义通用方法,比如Execute()
}

// 原有泛型接口继承非泛型接口
public interface IMVCCommand<T1> : IMVCCommand
{
    // 保留原有逻辑
}

然后新增单泛型参数的DispatchCommand重载:

public IMVCCommand DispatchCommand<TCommand>() where TCommand : IMVCCommand, new()
{
    // 解析TCommand实现的泛型IMVCCommand接口
    var genericCommandInterface = typeof(TCommand).GetInterfaces()
        .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IMVCCommand<>));
    
    if (genericCommandInterface == null)
    {
        throw new ArgumentException($"类型{typeof(TCommand).Name}未实现IMVCCommand<T1>泛型接口");
    }

    // 获取参数类型T1
    var parameterType = genericCommandInterface.GetGenericArguments()[0];
    // 构造原双泛型参数的DispatchCommand方法
    var targetMethod = typeof(/* 此处替换为DispatchCommand所在的类名 */)
        .GetMethods()
        .First(m => m.Name == nameof(DispatchCommand) && m.GetGenericArguments().Length == 2)
        .MakeGenericMethod(typeof(TCommand), parameterType);
    
    // 执行并返回结果
    return (IMVCCommand)targetMethod.Invoke(this, null);
}

实现后你就可以直接按需求调用:

DispatchCommand<CreateEnvironmentsCommand>();

方案2:利用参数自动推导泛型类型

如果你调用方法时会传入命令参数,可以通过方法参数让编译器自动推导T1类型,不需要显式声明。

修改方法定义,新增参数入参:

IMVCCommand<T1> DispatchCommand<TCommand, T1>(T1 parameter) where TCommand : IMVCCommand<T1>, new()
{
    var command = new TCommand();
    // 你的原有逻辑,比如给command绑定parameter
    return command;
}

调用时编译器会自动根据你传入的参数推导T1类型,无需显式声明:

DispatchCommand<CreateEnvironmentsCommand>(new LevelVO());

内容的提问来源于stack exchange,提问作者Umutcan Ertürk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:36:00