【问题标题】:Can I check if class implements an interface when it is casted to other interface [closed]我可以检查类在转换为其他接口时是否实现接口[关闭]
【发布时间】:2013-07-03 15:17:16
【问题描述】:

这样可以检查接口实现吗?

class ProjectSettingsApplier : ISettingsApplier, IApplyChanges
{
}


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

【问题讨论】:

  • 您的编译器对此有何评论??? (= 你需要更少的时间自己尝试而不是询问)。
  • 你自己试过了吗?

标签: c# interface casting


【解决方案1】:

来自documentation for is

如果提供的表达式为 非空,并且提供的对象可以转换为提供的类型 不会引发异常。否则,表达式 计算结果为假。

所以我会说是的,这是可行的。

也就是说,一个简单的重现可能会为您回答这个问题。

【讨论】:

    【解决方案2】:

    是的,这是有效的,看起来是进行检查的好方法。

    如果所有IApplyChanges也是ISettingsAppliers,你应该把IApplyChanges : ISettingsApplier,使关系更清晰。

    【讨论】:

      【解决方案3】:

      是的,这是合法的,因为 applier 实际上是在实现 IApplyChanges。在您的情况下,评估将是true

      或者,您可以使用IsAssignableFrom,但它更健谈,您必须确保应用程序不是null

      typeof(IApplyChanges).IsAssignableFrom(applier.GetType());
      

      【讨论】:

        【解决方案4】:

        这完全没问题,但如果你想继续将接口转换为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.
        }
        

        【讨论】:

          猜你喜欢
          • 2016-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          • 2010-09-21
          • 2020-11-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多