方法,该方法仅接受实现特定接口的类

本文关键字:方法 接口 实现 | 更新日期: 2023-09-27 18:11:02

我有以下方法

    private void PushToMainWindow(UserControl child) // where child is IMainWindowPlugin
    {
        _navigationStack.Push((IMainWindowPlugin)child);
        ...
        // Here I do stuff that makes use of the child as a usercontrol
        child.Width = 500;
        child.Margin = new Thickness(0,0,0,0);
        ...
    }

我想做的是通知编译器,我将只接受UserControl对象,也实现了IMainWindowPlugin接口。

我知道我可以做一个if语句和抛出或cast和null检查,但这些都是运行时的解决方案,我正在寻找一种方法来告诉开发人员,有一个限制类型的UserControl,他可以添加。有没有一种方法在c#中说这个?

更新:添加了更多的代码来显示usercontrol是作为usercontrol使用的,所以我不能只将子控件作为接口传递。

方法,该方法仅接受实现特定接口的类

您考虑过泛型吗?像这样的代码应该可以工作:

    private void PushToMainWindow<T>(T child) where T: UserControl, IMainWindowPlugin
    {
        var windowPlugin = child as IMainWindowPlugin;
        _navigationStack.Push(windowPlugin);
        ...
        // Here I do stuff that makes use of the child as a usercontrol
        child.Width = 500;
        child.Margin = new Thickness(0,0,0,0);
        ...
    }

编译器将不允许传递给不满足where子句的PushToMainWindow()方法对象,这意味着您传递的类必须是UserControl(或派生)并实现IMainWindowPlugin

另一件事是,传递接口本身可能是更好的主意,而不是基于具体实现。

为什么不

void PushToMainWindow(IMainWindowPlugin child) { ... }
 private void PushToMainWindow(IMainWindowPlugin child) 
    {
        _navigationStack.Push(child);
        var newChild=(UserControl )child
        newChild.Width = 500;
        newChild.Margin = new Thickness(0,0,0,0);
    }
相关文章: