C# 当类被强制转换到其他接口时,我可以检查它是否实现了一个接口吗
可以用这种方式检查接口实现吗C# 当类被强制转换到其他接口时,我可以检查它是否实现了一个接口吗,c#,interface,casting,C#,Interface,Casting,可以用这种方式检查接口实现吗 class ProjectSettingsApplier : ISettingsApplier, IApplyChanges { } ISettingsApplier applier = new ProjectSettingsApplier() if(applier is IApplyChanges) { //Is it true?? } 是的,这是有效的,而且看起来是一个很好的检查方法 如果所有IApplyChanges也都是ISettingsApp
class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}
ISettingsApplier applier = new ProjectSettingsApplier()
if(applier is IApplyChanges)
{
//Is it true??
}
是的,这是有效的,而且看起来是一个很好的检查方法 如果所有IApplyChanges也都是ISettingsApplier,则应使IApplyChanges:ISettingsApplier更清晰,以使关系更清晰。来自: 如果提供的表达式为,则is表达式的计算结果为true 非null,并且可以将提供的对象强制转换为提供的类型 不会导致抛出异常。否则,表达式 计算结果为false 所以我会说是的,那会管用的 这就是说,一个简单的复制可能会为您解答这个问题。是的,这是合法的,因为applier实际上正在实施IApplyChanges。在您的情况下,评估结果将是真实的 或者,您可以使用IsAssignableFrom,但它更容易聊天,您必须确保applier不为null:
这很好,但是如果您想继续将接口强制转换为IApplyChanges来使用它,您应该使用as而不是is like: 这样做可以避免双重类型检查,但效率不高。换句话说,不要这样做:
ISettingsApplier applier = new ProjectSettingsApplier()
if (applier is IApplyChanges) // Type check #1
{
var changer = (IApplyChanges) applier; // Type check #2: Inefficient.
// Use changer.
}
您的编译器对此有何评论??=你自己试的时间比问的时间要少。你自己试过吗?
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.
}