获取接口,但不要获取基础接口

本文关键字:获取 接口 取接口 | 更新日期: 2023-09-27 18:08:56

这里有个小问题。

我有接口"ISuperAbility"。我有一些继承自ISuperAbility的超能力(也包括接口)。

所以,我有一个字典,Type作为键,double(点)作为值。在那个字典中我有下一个数据:

        abilityPoints = new Dictionary<Type, double>();
        abilityPoints.Add(typeof(IFlyable), 2.0f);
        abilityPoints.Add(typeof(IInvisible), 4.0f);
        abilityPoints.Add(typeof(IMindsReadable), 6.0f);
        abilityPoints.Add(typeof(IWallWalkable), 1.0f);

所有这些"能力"都是继承自ISuperAbility的接口。

然后,我有一个英雄,例如"Mysterio",它实现了两个接口:IMindsReadbleIInvisible

所以,当我想获得某个英雄的所有分数时,我做了下面的事情:

        public static double ForceOfHuman(Human hero)
        {
            double force = 0;
            Console.WriteLine(hero.GetType());
            Type[] humanInterfaces = hero.GetType().GetInterfaces();
            foreach (Type humanInterface in humanInterfaces)
            {
                if (humanInterface.IsAssignableFrom(typeof(ISuperAbility)))
                {
                    force += XMenLaboratory.abilityPoints[humanInterface];
                }
            }
            return force;
        }

之后,我有一个异常,告诉我这个问题,因为字典没有这样一个键。关键字是"ISuperAbility"

这样在方法中搜索也返回一个基接口。这正常吗?我想,不止这些。

那么,我能做些什么来获得除基1以外的接口呢?

编辑1

我必须说,在某些时刻我错了。我从ISuperAbility继承的能力没有达到这个条件
if (humanInterface.IsAssignableFrom(typeof(ISuperAbility)))
    {
        force += XMenLaboratory.abilityPoints[humanInterface];
    }

编辑2

解决方案,我更喜欢的是下一个:

                if (typeof(ISuperAbility).IsAssignableFrom(humanInterface) && humanInterface != typeof(ISuperAbility))
                {
                    force += XMenLaboratory.abilityPoints[humanInterface];
                }

谢谢大家。

获取接口,但不要获取基础接口

您可以从foreach语句中排除接口ISuperAbility:

foreach (Type humanInterface in humanInterfaces.Where(i => i != typeof(ISuperAbility)))

这样你会得到所有的能力接口,除了ISuperAbility

您可以按照@dotnetom所说的去做。这是一个简单的(可能也是最好的)工作解决方案。

或者——如果你想要一些通用的解决方案——你可以对所有类型(接口类型)调用"GetInterfaces()"。如果结果是空array/null,你就会知道,它是"根接口"并跳过它。

编辑:

示例代码:

public static double ForceOfHuman(Human hero)
{
    double force = 0;
    Console.WriteLine(hero.GetType());
    Type[] humanInterfaces = hero.GetType().GetInterfaces();
    foreach (Type humanInterface in humanInterfaces)
    {
        if (humanInterface.GetInterfaces().Length < 1)
        {
            // the interface is "base interface", so we ignore it
            continue;
        }
        // we are suming the ability point from "derived interface"
        force += XMenLaboratory.abilityPoints[humanInterface];
    }
    return force;
}