重载方法自动类型转换咨询:如何替代手动类型判断转换调用重载方法
更优雅的自动调用重载Fire方法的方案
嘿,我太懂这种写一堆is+as判断的麻烦了!每次加新的武器类型都得改判断链,维护起来真心累。下面给你几个更自动、更优雅的解决方案,根据你的场景选就行:
1. 用dynamic类型(最简单的写法)
C#的dynamic会把类型匹配推迟到运行时,直接帮你找到对应的重载方法,一行代码搞定:
Fire((dynamic)currentWeapon);
注意事项:
- 如果
currentWeapon的类型没有对应的Fire重载,会抛出RuntimeBinderException,所以最好要么确保所有武器子类都有对应的Fire方法,要么加一个兜底的void Fire(object weapon)方法来处理未知类型。 - 这种写法虽然简洁,但牺牲了编译时的类型检查,适合小型项目或者类型变动不频繁的场景。
2. 访问者模式(编译时安全,适合大型项目)
如果你的武器类型会频繁扩展,或者想要严格的编译时检查,访问者模式是绝佳选择——新增武器类型时,编译器会强制你补充对应的处理逻辑,不会漏。
步骤:
首先给武器基类定义一个接受访问者的抽象方法,再定义访问者接口:
public abstract class Weapon { public abstract void Accept(IWeaponVisitor visitor); } public interface IWeaponVisitor { void Visit(MeleeWeapon weapon); void Visit(GunWeapon weapon); void Visit(MachineGun weapon); }
然后让每个武器子类实现Accept方法,调用访问者对应的方法:
public class MeleeWeapon : Weapon { public override void Accept(IWeaponVisitor visitor) { visitor.Visit(this); } } public class GunWeapon : Weapon { public override void Accept(IWeaponVisitor visitor) { visitor.Visit(this); } } public class MachineGun : Weapon { public override void Accept(IWeaponVisitor visitor) { visitor.Visit(this); } }
接下来创建一个专门处理Fire逻辑的访问者类:
public class FireWeaponVisitor : IWeaponVisitor { public void Visit(MeleeWeapon weapon) { Fire(weapon); } public void Visit(GunWeapon weapon) { Fire(weapon); } public void Visit(MachineGun weapon) { Fire(weapon); } // 这里放你原来的各个Fire重载方法 private void Fire(MeleeWeapon weapon) { // 你的近战武器开火逻辑 } private void Fire(GunWeapon weapon) { // 你的枪械开火逻辑 } private void Fire(MachineGun weapon) { // 你的机枪开火逻辑 } }
最后调用的时候就非常简洁了:
var fireVisitor = new FireWeaponVisitor(); currentWeapon.Accept(fireVisitor);
3. C# 7+ 模式匹配(简洁又安全)
如果你的武器类型不算特别多,用C#的模式匹配可以把原来的if-else链简化成更清晰的switch语句,而且是编译时检查,不会有运行时错误:
switch (currentWeapon) { case MeleeWeapon meleeWeapon: Fire(meleeWeapon); break; case GunWeapon gunWeapon: Fire(gunWeapon); break; case MachineGun machineGun: Fire(machineGun); break; default: // 处理未知武器类型的逻辑,比如抛出异常或者打日志 break; }
这种写法比原来的链式if-else清爽太多,而且新增类型时只要在switch里加个case就行,编译器会帮你检查有没有遗漏。
内容的提问来源于stack exchange,提问作者pasotee
相关产品推荐
相关产品推荐

