方法,该方法仅接受实现特定接口的类
本文关键字:方法 接口 实现 | 更新日期: 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);
}