这是一个小问题。
我有界面“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];
}
坦克你们。
答案 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;
}