ここにはほとんど問題はありません。インタフェースを取得しますが、基本インタフェースを取得しません
私はインターフェース「ISuperAbility」を持っています。 そして、私はISuperAbilityから継承したいくつかのsuperAbilities(インターフェースもあります)を持っています。
私はキーとしてタイプを、値としてダブル(ポイント)の辞書を持っています。私は、次のデータを持っている辞書で :
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からinheriedのインタフェースです。
その後、私は2つのインターフェイスを実装例えばヒーロー、「ミステリオ」、持っている:
:私は特定のヒーローのすべてのポイントを取得したいとき、私は次のことを行う、SO IMindsReadble IInvisibleを
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」です。
メソッドの検索でも基本インターフェイスが返されるようにします。それは普通ですか?私はそれ以上に思う。
したがって、ベース以外のインターフェイスを取得するにはどうすればよいですか?
EDIT 1
私はある瞬間に間違っていたことを、言わなければなりません。 ISuperAbilityからinheried私の能力は、この条件に到達していない私は好まこと
if (humanInterface.IsAssignableFrom(typeof(ISuperAbility)))
{
force += XMenLaboratory.abilityPoints[humanInterface];
}
EDIT 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)'を使うべきです。あなたの状態は間違っているので、それが届かないのです。 –