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

C#如何从IItem类型列表中提取所有IEquipable接口实例

问题原因排查

首先你写的char.Items.OfType<IEquipable>().ToList()本身语法完全正确,出现返回空列表的情况,100%是类型匹配问题,常见原因如下:

  • 命名空间冲突:项目中存在两个同名的IEquipable接口,分属不同命名空间。Helmet、Bow类实现的是其中一个命名空间下的接口,而你在OfType中引用的是另一个命名空间的接口,导致类型匹配失败。
  • 接口实现错误:Helmet、Bow类的定义没有正确继承IEquipable接口,比如拼写错误(比如把IEquipable写成IEquippable)、漏写接口继承。
  • 实例添加错误:你实际添加到char.Items中的Helmet、Bow实例并非对应实现了IEquipable的类的实例,可能是错用了其他同名类。
验证与解决方法

第一步:验证类型匹配

你可以在代码中加一行调试代码,确认类型是否匹配:

// 取你添加的第一个IEquipable类型的实例,这里是第三个元素索引为2
var isMatch = typeof(IEquipable).IsAssignableFrom(char.Items[2].GetType());
// 输出isMatch值,如果为false则确定是类型匹配问题

如果isMatch返回false,检查IEquipable的命名空间引用,以及Helmet、Bow的类定义,确保继承的是同一个IEquipable接口。
正确的类定义示例如下:

public class Helmet : IEquipable
{
    public string Name { get; set; }
    public void Equip()
    {
        // 装备逻辑
    }
}

public class Bow : IEquipable
{
    public string Name { get; set; }
    public void Equip()
    {
        // 装备逻辑
    }
}

第二步:正确提取列表

确认类型匹配无误后,你原来的写法就可以正常返回结果,也可以用以下写法实现相同效果:

List<IEquipable> equipmentList = char.Items
    .Where(x => x is IEquipable)
    .Cast<IEquipable>()
    .ToList();

后续使用示例

提取完成后就可以正常调用接口方法,注意你示例中写的IEquipment是笔误,正确类型是IEquipable:

// 取第一个装备
IEquipable firstEquipment = equipmentList.First();
firstEquipment.Equip();

内容的提问来源于stack exchange,提问作者thexbuttonisntworking

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:09:04