【发布时间】:2017-02-02 23:43:06
【问题描述】:
这是一个小问题。
我有界面“ISuperAbility”。 而且我有一些从 ISuperAbility 继承的 superAbilities(也是接口)。
所以,我有一个字典,其中 Type 作为键,double(points) 作为值。 在那个字典里我有下一个数据:
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”: IMindsReadble 不可见
所以,当我想获得某个英雄的所有分数时,我会做下一件事:
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”。
因此,方法中的搜索也返回一个基本接口。正常吗?我认为,不止于此。
那么,除了base 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];
}
谢谢大家。
【问题讨论】:
-
您的
IsAssignableFrom正确吗?您不是要寻找typeof(ISuperAbility).IsAssignableFrom( humanInterface)的接口吗? -
@IanMercer 对不起,我不明白你的意思。我的代码不适合我的目的吗?是不是逻辑有问题?
-
@VladislavHromyh Ian Mercer 的意思是,为了检查
humanInterface是否继承ISuperAbility,您应该使用typeof(ISuperAbility).IsAssignableFrom( humanInterface)。你的条件不对,所以达不到。 -
你的情况倒退了。
IFlyable不能从ISuperAbility分配,它可以分配给ISuperAbility。 -
哦,谢谢你们。我是第一次使用,所以使用方法IsAssignableFrom()的方式不对。
标签: c# inheritance reflection interface