我可以检查类在转换到其他接口时是否实现了接口

时间:2013-07-03 15:17:16

标签: c# interface casting

是否可以通过这种方式检查接口实现?

class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}


ISettingsApplier applier = new ProjectSettingsApplier()
if(applier is IApplyChanges)
{
    //Is it true??
}

4 个答案:

答案 0 :(得分:4)

来自documentation for is

  

如果提供的表达式是,则表达式的计算结果为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.
}