获取接口但不是基础接口

时间:2016-09-25 16:24:34

标签: c# inheritance reflection interface

这是一个小问题。

我有界面“ISuperAbility”。 我有一些继承自ISuperAbility的超级功能(也是接口)。

所以,我有一个字典,其中Type为键,double(points)为Value。 在那本词典中,我有下一个数据:

let text = "Text"
let asAny = text as Any
let asAnyObject = text as AnyObject
let asNSString: NSString = text as NSString

type(of: text) // Prints String.Type
type(of: asAny) // Prints String.Type
type(of: asAnyObject) // Prints _NSContiguousString.Type
type(of: asNSString) // Prints _NSContiguousString.Type

所有这些“能力”都是从ISuperAbility继承的接口。

然后,我有英雄,例如“Mysterio”,它实现了两个接口: IMindsReadble IInvisible

所以,当我想获得某些英雄的所有积分时,我会做下一件事:

        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”。

因此,在方法中搜索也返回一个基本接口。这是正常的吗?我想,不仅如此。

那么,除了基础之外,我还能做些什么呢?

编辑1

我必须说,我在某个时刻错了。 我从ISuperAbility继承的能力没有达到这个条件

        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;
        }

编辑2

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

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

坦克你们。

2 个答案:

答案 0 :(得分:2)

您可以从typings install dt~jquery --global --save 声明中排除界面ISuperAbility

foreach

这样您就可以获得所有能力界面,foreach (Type humanInterface in humanInterfaces.Where(i => i != typeof(ISuperAbility))) 除外。

答案 1 :(得分:1)

你可以像@dotnetom所说的那样做。这是一个简单(可能是最好的)工作解决方案。

或者 - 如果你想要一些通用解决方案 - 你可以在所有类型(接口类型)上调用“GetInterfaces()”。如果结果为空数组/ 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;
}