C#:我如何确定接口变量的类型?

时间:2012-07-28 02:23:39

标签: c# casting type-conversion

我有一个接口变量IAction nextAction。

我想看看nextAction是否具体实现,但是当我尝试以下操作时失败:

IAction nextAction = GetNextAction();

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

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

3 个答案:

答案 0 :(得分:5)

我相信“是”就是你要找的东西。一般来说:

if (nextAction is ButtonClickedAction) {
   ...
}

在第二次检查时,看起来您正试图查看操作是否已更改

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

这种方法的唯一问题是,如果你有某种类型的继承你想要尊重并且你并不关心完全匹配(例如,自从ClickAventArg派生自EventArg以来,EventArg与ClickEventArg都被认为是相同的类型) 。如果是这种情况this SO answer might be of some help

答案 1 :(得分: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运算符可以用于接口,它也尊重继承。阅读:What is the difference between typeof and the is keyword?

答案 2 :(得分:2)

nextAction.GetType()将为您提供具体的对象类型。

然而,这不是很好的设计,接口的一点是你只使用界面中可用的共享功能。

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