2016-09-25 4 views
1

ここにはほとんど問題はありません。インタフェースを取得しますが、基本インタフェースを取得しません

私はインターフェース「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]; 
       } 

戦車あなたのすべて。

+2

があなたの 'IsAssignableFrom'正しい方法ラウンドですか?あなたは 'typeof(ISuperAbility).IsAssignableFrom(humanInterface)'のインターフェースを探していませんか? –

+0

@IanMercer申し訳ありませんが、私はあなたを理解していません。私のコードは私の目的のために動かないのですか?論理に問題はありますか? –

+0

@ VladislavHromyh Ian Mercerが言っていることは、 'humanInterface'が' ISuperAbility'を継承しているかどうかを調べるために 'typeof(ISuperAbility).IsAssignableFrom(humanInterface)'を使うべきです。あなたの状態は間違っているので、それが届かないのです。 –

答えて

2

あなたのforeachの文からインターフェースISuperAbilityを除外することができます。

foreach (Type humanInterface in humanInterfaces.Where(i => i != typeof(ISuperAbility))) 

この方法であなたはISuperAbilityを除き、すべての能力・インタフェースを取得します。

1

これは@dotnetomの説明のとおりです。それは簡単な(そしておそらく最高の)働くソリューションです。

または、汎用ソリューションが必要な場合は、すべてのタイプ(インターフェイスのタイプ)で「GetInterfaces()」を呼び出すことができます。結果が空の配列/ nullになる場合は、「ルートインターフェース」であり、それをスキップすることがわかります。

EDIT: サンプルコード:

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

Hmgh ...主なアイデアを再編集できますか? 「すべてのタイプでGetInterfaces()」を呼び出すことができます。 –

+0

サンプルコードを追加しました。 – TcKs

+0

ああ...私は理解しています。例えばありがとう、私はそれを試してみます。 –

関連する問題