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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:45:04