繁体   English   中英

类的通用构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM