1

インターフェイス変数 IAction nextAction があります。

nextAction が具体的な実装であるかどうかを確認したいのですが、次のことを試したときに失敗しました:

IAction nextAction = GetNextAction();

if (nextAction.GetType() != typeof(LastAction)) {
 // do something...
}

IAction変数nextActionの具体的なタイプを決定する方法についてのアイデアはありますか?

4

3 に答える 3

5

「is」はあなたが探しているものだと思います。一般に:

if (nextAction is ButtonClickedAction) {
   ...
}

2回目の検査では、アクションが変更されたかどうかを確認しようとしているようです

private void DetermineIfActionChanged(IAction lastAction)
{
   IAction nextAction = GetNextAction();
   if (nextAction.GetType() != lastAction.GetType())
   {
       DoSomethingAwesome();
   }
}

このアプローチの唯一の問題は、尊重したいある種の継承があり、完全一致を気にしない場合です (たとえば、ClickEventArg は EventArg から派生するため、EventArg と ClickEventArg はどちらも同じ型と見なされます)。その場合は、この SO の回答が役立つ場合があります

于 2012-07-28T02:26:55.470 に答える
2

nextAction.GetType()オブジェクトの具体的なタイプがわかります。

ただし、これはあまり良い設計ではありません。インターフェイスのポイントは、インターフェイスで使用可能な共有機能のみを使用することです。

インターフェイスでカバーされていない機能が必要な場合は、必要なタイプの変数を宣言して、それを実行する必要があります。

于 2012-07-28T02:32:14.607 に答える
2

typeof()関数を使用するか、is演算子を使用できます。

typeof:

IAction nextAction = GetNextAction();

if (nextAction.GetType() != typeof(LastAction)) {
 // do something...
}

typeofタイプがまったく同じ場合にのみ true を返すことに注意してください。

is:

IAction nextAction = GetNextAction();

if (nextAction is LastAction) {
 // do something...
}

ただし、is演​​算子はインターフェイスに使用でき、継承も尊重することに注意してください。これを読んでください: typeof と is キーワードの違いは何ですか?

于 2012-07-28T02:26:29.883 に答える