1.代码优化
1.代码优化
csharp
基于枚举创建不同对象
1).根据工厂和字典模式
public static class BuffEffectFactory
{
// 字典:枚举 -> 对象构造委托
private static readonly Dictionary<BuffEffect, Func<BuffEffectBase>> _effectCreators = new();
static BuffEffectFactory()
{
// 预注册所有Buff类型
_effectCreators.Add(BuffEffect.RebuildCard, () => new RebuildBuffEffect());
_effectCreators.Add(BuffEffect.ControlDice, () => new ControlDiceBuffEffect());
_effectCreators.Add(BuffEffect.BuildLvVariation, () => new BuildLvBuffEffect());
_effectCreators.Add(BuffEffect.AddBuffByCondition, () => new AddBuffEffect());
_effectCreators.Add(BuffEffect.DirectionChange, () => new DirectionChangeBuffEffect());
}
public static BuffEffectBase Create(BuffEffect effectType)
{
if (_effectCreators.TryGetValue(effectType, out var creator))
{
return creator();
}
throw new ArgumentOutOfRangeException(nameof(effectType), $"未注册的Buff类型:{effectType}");
}
}
csharp
2).通过特性和反射的方式
// 1. 定义特性:标记类对应的枚举值
[AttributeUsage(AttributeTargets.Class)]
public class BuffEffectAttribute : Attribute
{
public BuffEffect EffectType { get; }
public BuffEffectAttribute(BuffEffect effectType) => EffectType = effectType;
}
// 2. 给Buff类标记特性
[BuffEffect(BuffEffect.RebuildCard)]
public class RebuildBuffEffect : BuffEffectBase { }
[BuffEffect(BuffEffect.ControlDice)]
public class ControlDiceBuffEffect : BuffEffectBase { }
csharp
static BuffEffectFactory()
{
// 优化1:只扫描指定程序集(避免遍历所有程序集,减少扫描量)
var targetAssembly = Assembly.GetExecutingAssembly(); // 假设Buff类都在当前程序集
var buffTypes = targetAssembly.GetTypes()
.Where(type => typeof(BuffEffectBase).IsAssignableFrom(type)
&& !type.IsAbstract
&& type.GetCustomAttribute<BuffEffectAttribute>() != null);
foreach (var type in buffTypes)
{
var attribute = type.GetCustomAttribute<BuffEffectAttribute>();
if (attribute == null) continue;
// 优化2:缓存构造函数委托,替代Activator.CreateInstance
var constructor = type.GetConstructor(Type.EmptyTypes); // 无参构造
if (constructor == null)
{
throw new InvalidOperationException($"{type.Name} 必须提供无参构造函数");
}
// 将构造函数转为委托,调用时无反射损耗
var creator = (Func<BuffEffectBase>)Delegate.CreateDelegate(
typeof(Func<BuffEffectBase>), constructor);
_effectCreators.Add(attribute.EffectType, creator);
}
}