我正在努力更好地理解泛型,但我陷入困境,因为我想重构我的代码示例,但它不起作用,我的理解还不够好,不知道为什么以及如何能够解决它:
我的例子只是出于教育目的,所以我不担心性能或内存泄漏等......
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
提前谢谢!
答案 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>;
}