1

我有一个接口变量 IAction nextAction。

我想看看 nextAction 是否有一个具体的实现,但是当我尝试以下操作时没有成功:

IAction nextAction = GetNextAction();

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

关于如何确定 IAction 变量 nextAction 的具体类型的任何想法?

4

3 回答 3

5

我相信“是”是您正在寻找的。一般来说:

if (nextAction is ButtonClickedAction) {
   ...
}

在第二次检查时,您似乎正在尝试查看操作是否已更改

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

这种方法的唯一问题是,如果您有某种想要尊重的继承并且您不关心精确匹配(例如,EventArg 与 ClickEventArg 将被视为同一类型,因为 ClickEventArg 派生自 EventArg)。如果是这种情况,这个 SO answer 可能会有所帮助

于 2012-07-28T02:26:55.470 回答
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 回答
2

nextAction.GetType()会给你对象的具体类型。

但是,这不是很好的设计,界面的重点是您只使用界面中可用的共享功能。

如果您需要接口未涵盖的功能,那么您应该声明所需类型的变量并完成它。

于 2012-07-28T02:32:14.607 回答