[英]Generic Constructor of class
我有以下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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.