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.
}