C# 去除if-else以及子类管理 (下)利用反射获取策略的子类

本文探讨了如何通过反射改进C#中的策略模式,以动态获取和执行子类,避免if-else。虽然反射引入了一定的性能开销,但提供了更灵活的子类管理方式。在解决问题的过程中,作者发现接口基类无法获取具体类型,于是将接口改为抽象类,并要求子类重写方法。最后,添加新会员制度只需创建相应子类即可。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总体的解决方法全部使用反射,所以会消耗一定的性能,如果大家又更好的方法欢迎留言讨论

这一篇我们将解决手动编辑Type数组的问题,直接修改工厂类。 

using System;
using System.Collections.Generic;
using System.Reflection;

public class VipStrategyFactory
{
    private static VipStrategyFactory _instance;

    public static VipStrategyFactory Instance
    {
        get
        {
            if (_instance == null)
                _instance = new VipStrategyFactory();
            return _instance;
        }
    }

    //改写获取方法,利用特性筛选
    public IVipStrategy GetVipStrategy(Consumer consumer)
    {
        var totalConsume = consumer.TotalConsume;
        var types = GetVipStrategy();
        foreach (var type in types)
        {
            var att = GetAttribute(type);
            if (att == null) continue;
            if ((att.Min <= totalConsume) && (totalConsume < att.Max))
                return (IVipStrategy) Activator.CreateInstance(type);
        }
        return new PublicVipStrategy();
    }

    private PriceAttribute GetAttribute(Type t)
    {
        var atts = t.GetCustomAttributes(typeof(PriceAttribute), true);
        if ((atts == null) || (atts.Length <= 0)) return null;
        foreach (PriceAttribute att in atts)
            return att;
        return null;
    }

    private Type[] GetVipStrategy()
    {
        var temp = Assembly.GetCallingAssembly().GetTy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值