C#中能否将泛型类实例转换为非泛型版本调用无泛型依赖方法?
问题结论
你写的转换逻辑默认无法直接编译通过:C#中Impactable<T>泛型类型和你代码里想转换的非泛型Impactable是完全独立的两个类型,你并没有定义非泛型的Impactable类型,因此无法直接完成这个转换。
解决方案
不需要完全重构现有代码,只需要补充一层非泛型的抽象层即可,改动量极小:
方案1:提取非泛型基类
先定义非泛型的Impactable基类,把所有不依赖泛型参数T的成员都放到基类中:
public class Impactable { // 注意要把方法访问权限改成public/protected internal才能外部/子类访问 public void DoSomethingIndependentOfT(){} } // 泛型子类继承非泛型基类 public class Impactable<T> : Impactable where T : Spawnable<T> { protected T spawnable = Spawnable<T>.Instance; // 原有依赖T的逻辑保持不变 }
修改后你原有示例里的转换、调用代码可以直接正常运行。
方案2:提取非泛型接口
如果不想用基类继承,也可以定义非泛型接口承载无依赖的方法:
public interface IImpactable { void DoSomethingIndependentOfT(); } public class Impactable<T> : IImpactable where T : Spawnable<T> { protected T spawnable = Spawnable<T>.Instance; public void DoSomethingIndependentOfT(){} // 原有其他逻辑保持不变 }
修改后调整转换代码即可:
MyEnemyA enemy = new MyEnemyA(); IImpactable x = enemy; x.DoSomethingIndependentOfT();
额外注意
你原有代码里的DoSomethingIndependentOfT默认是私有访问权限,外部无法调用,需要根据使用场景调整为public/internal访问权限。
内容的提问来源于stack exchange,提问作者Jack Avante
相关产品推荐
相关产品推荐

