能否将三个HtmlEncodeUserDetails方法合并为一个且不新增ViewModel?
合并三个HtmlEncodeUserDetails重载方法的可行方案
完全可以合并成一个方法,给你几个不用新建ViewModel的实现思路:
泛型+反射方案
写一个泛型方法,通过反射自动识别并处理目标属性,不用修改现有任何ViewModel。缺点是编译期没法做类型检查,属性名写错会在运行时出问题。示例代码:
public static void HtmlEncodeUserDetails<T>(T viewModel) { // 处理ViewModel本身 HtmlEncodeUserDetailsByViewModel(viewModel); // 反射获取并处理BusinessInfoVm var businessInfoProp = typeof(T).GetProperty("BusinessInfoVm"); businessInfoProp?.GetValue(viewModel)?.Let(HtmlEncodeUserDetailsByViewModel); // 反射获取并处理AddressVm var addressProp = typeof(T).GetProperty("AddressVm"); addressProp?.GetValue(viewModel)?.Let(HtmlEncodeUserDetailsByViewModel); } // 辅助扩展方法,简化空值检查 private static void Let<T>(this T obj, Action<T> action) where T : class { if (obj != null) action(obj); }模式匹配方案(C# 7.0及以上)
用object作为方法参数,通过switch模式匹配判断传入的ViewModel类型,针对性处理属性。这种方式编译期有类型检查,不会出现属性名错误,也不用改现有ViewModel。示例代码:
public static void HtmlEncodeUserDetails(object viewModel) { HtmlEncodeUserDetailsByViewModel(viewModel); switch (viewModel) { case ProfileEditViewModel vm: HtmlEncodeUserDetailsByViewModel(vm.BusinessInfoVm); HtmlEncodeUserDetailsByViewModel(vm.AddressVm); break; case BillingPageViewModel vm: HtmlEncodeUserDetailsByViewModel(vm.BusinessInfoVm); HtmlEncodeUserDetailsByViewModel(vm.AddressVm); break; case OfflineSaleViewModel vm: HtmlEncodeUserDetailsByViewModel(vm.BusinessInfoVm); HtmlEncodeUserDetailsByViewModel(vm.AddressVm); break; } }共享接口方案(仅修改现有ViewModel,无需新建)
如果允许给现有三个ViewModel加接口实现,可以定义一个包含BusinessInfoVm和AddressVm属性的接口,让三个ViewModel都实现它。这种方案类型安全、性能最优,而且不算新建ViewModel,只是给现有类加个契约。示例代码:
// 定义接口(仅作为属性契约,不是新ViewModel) public interface IHasUserDetails { BusinessInfoVm BusinessInfoVm { get; set; } AddressVm AddressVm { get; set; } } // 给现有ViewModel添加接口实现(比如ProfileEditViewModel) public class ProfileEditViewModel : IHasUserDetails { // 原有代码... public BusinessInfoVm BusinessInfoVm { get; set; } public AddressVm AddressVm { get; set; } } // 统一处理方法 public static void HtmlEncodeUserDetails(IHasUserDetails viewModel) { HtmlEncodeUserDetailsByViewModel(viewModel); HtmlEncodeUserDetailsByViewModel(viewModel.BusinessInfoVm); HtmlEncodeUserDetailsByViewModel(viewModel.AddressVm); }
内容的提问来源于stack exchange,提问作者Emilija Vilija Trečiokaitė
相关产品推荐
相关产品推荐

