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

时间:2015-09-03 08:19:33

标签: 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接口的UserControl对象。

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

更新: 添加了更多代码以显示usercontrol用作usercontrol,因此我不能仅将子项作为接口传递。

3 个答案:

答案 0 :(得分:3)

您是否考虑过仿制药?这样的事情应该有效:

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

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

另外一点是,可能通过界面本身是更好的主意,而不是基于具体的实现。

答案 1 :(得分:0)

为什么不

void PushToMainWindow(IMainWindowPlugin child) { ... }

答案 2 :(得分:0)

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