C#:实现特定接口的方法参数

C#: A method parameter that implements a particular interface

假设我有一个名为 UIViewController 的 class。

public class UIViewController
{
    // ... methods
}

我有一个接口IDoFancyFlips

public interface IDoFancyFlips
{
   // ... methods
}

我有一个 class 扩展 UIViewController 并实现接口如下。

public class FancyViewController : UIViewController, IDoFancyFlips
{
   // ... methods
}

现在我想写一个方法,它接受一个 UIViewController 作为参数,但只有实现 IDoFancyFlips.

的方法
public void FlipAndShow(??? controller) {
    // implementation
}

我的问题是我要在 ??? 中输入什么。我似乎找不到任何方法来做到这一点。

我可以在 Objective C 中执行以下操作:

- (void) flipAndShow:(UIViewController<IDoFancyFlips>*) controller {
    // implementation
}

但我在 C# 中找不到等效的声明。

您可以使用泛型来完成此操作。尝试以下操作:

public void FlipAndShow<TFancyFlippingController>
       (TFancyFlippingController fancyFlippingController) 
     where TFancyFlippingController : UIViewController, IDoFancyFlips
{
    // implementation
}

where TFancyFlippingController : UIViewController, IDoFancyFlips 约束确保为 TFancyFlippingController 指定的参数必须继承自 UIViewController 并实现 IDoFancyFlips 接口。

考虑到您所有的特定视图控制器都继承自基础 UIViewController class

public class FancyViewController : UIViewController, DoFancyFlips
{
    // ... methods
}

public class NormalViewController : UIViewController
{
    // ... methods
}

可以在运行时检查传入的实例是否为DoFancyFlips类型,再做进一步的处理;喜欢

    public static void FlipAndShow(UIViewController controller)
    {
        if (!(controller is DoFancyFlips))
            return;

        // implementation
    }