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

时间:2015-09-02 09:31:33

标签: c# generics

我正在努力更好地理解泛型,但我陷入困境,因为我想重构我的代码示例,但它不起作用,我的理解还不够好,不知道为什么以及如何能够解决它:

我的例子只是出于教育目的,所以我不担心性能或内存泄漏等......

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

提前谢谢!

1 个答案:

答案 0 :(得分:1)

  

但它不起作用。有没有办法实现这个目标?

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