c# - 只接受实现特定接口(interface)的类的方法

标签 c# wpf user-controls

我有以下方法

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

我想做的是通知编译器我将只接受同样实现了 IMainWindowPlugin 接口(interface)的 UserControl 对象。

我知道我可以执行 if 语句并抛出或强制转换并检查是否为 null,但这些都是运行时解决方案,我正在寻找一种方法来预先告诉开发人员存在对 null 的限制他可以添加的 UserControl 类型。有没有办法在 C# 中这样说?

更新: 添加了更多代码以显示 usercontrol 用作 usercontrol,因此我不能只将 child 作为接口(interface)传递。

最佳答案

您是否考虑过泛型?这样的事情应该有效:

    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

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

关于c# - 只接受实现特定接口(interface)的类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32370460/

相关文章:

c# - MEF:从不同的插件加载插件

c# - 使用 MemoryMappedFile 将 2 个数组从 CreateFileMappingW 共享到 C#

wpf - 嵌套 View 模型的 MVVM 命令绑定(bind)

c# - 事件处理程序 + 格式化多个按钮 - WPF

c# - 在加载时将焦点设置在单个文本框上的最简单方法

c# - VS .NET 自定义组件中的属性编辑样式为 DropDown

html - 如何分别控制Shiny中selectInput的标签和选择文本的字体大小样式?

c# - 如何散列密码

c# - ASP .NET - 设置 ListView InsertItemTemplate 的默认值

c# - 从用户控件继承以使用不同的子控件