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

能否将三个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ė

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:00:24