是否可以通过这种方式检查接口实现?
class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}
ISettingsApplier applier = new ProjectSettingsApplier()
if(applier is IApplyChanges)
{
//Is it true??
}
从文档中is
:
如果提供的表达式为非 null,则 is 表达式的计算结果为 true,并且提供的对象可以转换为提供的类型而不会引发异常。否则,表达式的计算结果为 false。
所以我会说是的,那会奏效。
也就是说,一个简单的复制可能会为您回答这个问题。
是的,这是有效的,并且看起来是进行检查的好方法。
如果IApplyChanges
都是ISettingsApplier
s,你应该做IApplyChanges : ISettingsApplier
,使关系更清晰。
是的,这是合法的,因为applier
实际上正在实施IApplyChanges
。在您的情况下,评估将是true
.
或者,您可以使用IsAssignableFrom
,但它更健谈,您必须确保应用程序不是null
:
typeof(IApplyChanges).IsAssignableFrom(applier.GetType());
这完全没问题,但如果你想继续转换接口以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.
}