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
相关产品推荐
相关产品推荐

