0

是否可以通过这种方式检查接口实现?

class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}


ISettingsApplier applier = new ProjectSettingsApplier()
if(applier is IApplyChanges)
{
    //Is it true??
}
4

4 回答 4

4

文档中is

如果提供的表达式为非 null,则 is 表达式的计算结果为 true,并且提供的对象可以转换为提供的类型而不会引发异常。否则,表达式的计算结果为 false。

所以我会说是的,那会奏效。

也就是说,一个简单的复制可能会为您回答这个问题。

于 2013-07-03T15:20:29.370 回答
2

是的,这是有效的,并且看起来是进行检查的好方法。

如果IApplyChanges都是ISettingsAppliers,你应该做IApplyChanges : ISettingsApplier,使关系更清晰。

于 2013-07-03T15:20:21.057 回答
2

是的,这是合法的,因为applier实际上正在实施IApplyChanges。在您的情况下,评估将是true.

或者,您可以使用IsAssignableFrom,但它更健谈,您必须确保应用程序不是null

typeof(IApplyChanges).IsAssignableFrom(applier.GetType());
于 2013-07-03T15:20:33.540 回答
0

这完全没问题,但如果你想继续转换接口以IApplyChanges使用它,你应该使用as而不是is像这样:

ISettingsApplier applier = new ProjectSettingsApplier()

var changer = applier as IApplyChanges;

if (changer != null) // Will only be non-null if it implements IApplyChanges
{
    // Use changer.
}

这样做可以避免双重类型检查,这种检查效率不高。换句话说,要这样做:

ISettingsApplier applier = new ProjectSettingsApplier()

if (applier is IApplyChanges) // Type check #1
{
    var changer = (IApplyChanges) applier; // Type check #2: Inefficient.
    // Use changer.
}
于 2013-07-03T15:28:41.170 回答