获取接口,但不要获取基础接口
本文关键字:获取 接口 取接口 | 更新日期: 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;
}