类的泛型构造函数
本文关键字:构造函数 泛型 | 更新日期: 2023-09-27 17:49:57
我有以下c#代码:
public interface IViewModel {
PageData Page { get; set; }
}
public class PageData { }
public class ViewModel<T> : IViewModel {
public PageData PageData { get; set; }
public T ViewData { get; set; }
public ViewModel(T viewData, PageData pageData) {
PageData = pageData;
ViewData = viewData;
}
}
然后我这样使用它:
PageData pd = new PageData();
ViewData vd = new ViewData();
ViewModel<MyViewData> model = new ViewModel<MyViewData>(vd, pd);
是否可以更改我的代码,以便我可以使用它:
IViewModel model = new ViewModel(vd, pd);
基本上ViewModel的类型是vd
不可以,但是您可以提供一个静态工厂方法来简化工作:
public static class ViewModel
{
public static ViewModel<T> Create<T>(T viewData, PageData pageData)
{
return new ViewModel<T>(viewData, pageData);
}
}
并像这样使用:
IViewModel model = ViewModel.Create(vd, pd);
不,不可能。在c#中,泛型不是通过擦除实现的,所以你创建的每个ViewModel
都必须在运行时知道它的泛型类型是什么,在它被构造的那一刻。所以构造函数需要有它的泛型类型,但是你仍然可以将它强制转换为没有泛型的IViewModel。
IViewModel model = new ViewModel<MyViewData>(vd, pd);
正如Alex指出的那样,您可以使用一个助手方法来推断第一个参数的类型,并在其new
表达式中使用该泛型类型。
你可以让你的MyViewData
实现Interface
,然后:
public class ViewModel : IViewModel {
public PageData PageData { get; set; }
public YOURINTERFACE ViewData { get; set; }
public ViewModel(YOURINTERFACE viewData, PageData pageData) {
PageData = pageData;
ViewData = viewData;
}
}