使用不同参数重载泛型方法以减少冗余

本文关键字:冗余 泛型方法 重载 参数 | 更新日期: 2023-09-27 18:10:59

我试图更好地理解泛型,但我卡住了,因为我想重构我的代码示例,但它不起作用,我的理解不够好,无法看到为什么以及如何修复它:

我的例子只是为了教育的目的,所以我不担心性能或内存泄漏等…

public static void InstanceView<TView, TViewModel>() 
    where TView : Window
    where TViewModel : class, new()
{
    var viewToInstance = (TView) Activator.CreateInstance(typeof (TView), new TViewModel());
    viewToInstance.ShowDialog();
    viewToInstance.Close();
}
public static void InstanceView<TView>()
    where TView : Window
{
    var viewToInstance = (TView)Activator.CreateInstance(typeof(TView));
    viewToInstance.ShowDialog();
    viewToInstance.Close();
}

我不想要冗余

viewToInstance.ShowDialog();
viewToInstance.Close();

目前我的解决方案是:

private static void displayHandle<T>(T window) where T : Window
{
    window.ShowDialog();
    window.Close();
}

我在InstanceView实现中调用这个而不是ShowDialog()等

我试过这样做:

public static void InstanceView<TView>()
where TView : Window
{
    InstanceView<TView, null>;
}

但是它不起作用。有办法做到这一点吗?

PS:我正在使用Visual Studio 2010

提前感谢!

使用不同参数重载泛型方法以减少冗余

但是它不起作用。有办法做到这一点吗?

null不是类型参数。更具体地说,在c#中,它甚至不是一个类型。由于您对TViewModel的约束是使用默认构造函数的引用类型,因此您可以将object类型传递给它,或任何符合约束的其他引用类型:

public static void InstanceView<TView>()
where TView : Window
{
    InstanceView<TView, object>;
}

public class Void { }
public static void InstanceView<TView>()
where TView : Window
{
    InstanceView<TView, Void>;
}