2015-05-19 6 views
2

Я следующий C# код:Generic Конструктор класса

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.

ответ

3

Нет, но то, что вы можете сделать, это предоставить статический фабричный метод, чтобы сделать жизнь проще:

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); 
2

Нет, это невозможно. В C# генерические элементы не реализуются путем стирания, поэтому каждый созданный вами ViewModel должен знать во время выполнения то, что его общий тип, на момент его создания. Поэтому конструктор должен иметь свой общий тип, но вы все равно можете использовать его как IViewModel без дженериков.

IViewModel model = new ViewModel<MyViewData>(vd, pd); 

Как Алекс указывает, вы можете использовать вспомогательный метод, который будет определить тип первого аргумента и использовать этот общий тип в своем выражении new.

0

Вы можете сделать свой 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; 
    } 
} 
Смежные вопросы