是否可以通过这种方式检查接口实现?我可以检查类是否实现了一个接口,当它被转换到其他接口
class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}
ISettingsApplier applier = new ProjectSettingsApplier()
if(applier is IApplyChanges)
{
//Is it true??
}
是否可以通过这种方式检查接口实现?我可以检查类是否实现了一个接口,当它被转换到其他接口
class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}
ISettingsApplier applier = new ProjectSettingsApplier()
if(applier is IApplyChanges)
{
//Is it true??
}
是的,这是有效的,看起来是一个很好的方法来做检查。
如果所有的IApplyChanges
也都是ISettingsApplier
s,您应该制作IApplyChanges : ISettingsApplier
,以使关系更清晰。
An是表达式评估为真,如果所提供的表达是 非空,并且所提供的对象可以被强制转换为提供的类型 而不会导致抛出异常。否则,表达式 的计算结果为false。
所以我会说是的,那会奏效。
也就是说,一个简单的repro可能会为你回答这个问题。
是的,这是合法的,因为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.
}
你的编译器说这个怎么样??? (=你需要更少的时间来尝试自己而不是问)。 –
你自己试过了吗? – Arran