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