类的泛型构造函数

本文关键字:构造函数 泛型 | 更新日期: 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;
  }
}