2016-02-21 2 views
3

У меня есть базовый класс:Как установить базовый класс свойство универсального класса

public abstract class MyBaseClass 
{ 
    public string MyProperty { get; set; } 
} 

, а затем класс, который пропускается универсальный класс, который получают вынесший TViewModel, который наследуется от MyBaseClass

public abstract class MyGenericController<TViewModel> : Controller 
    where TViewModel : MyBaseClass 
{ 
    public virtual async Task<IActionResult> Index() 
    { 
     object viewModel = Activator.CreateInstance(typeof(TViewModel)); 
     viewModel.MyProperty="test"; 
     return View(viewModel); 
    } 
} 

Это работает, как я хочу. Однако, как только я пытаюсь установить свойство базового класса я получаю ошибку компиляции:

object does not contain a definition for MyProperty on the line

viewModel.MyProperty="test"; 

Как установить свойство?

ответ

7

Используйте общий Activator.CreateInstance<T> вместо:

public virtual async Task<IActionResult> Index() 
{ 
    TViewModel viewModel = Activator.CreateInstance<TViewModel>(); 
    viewModel.MyProperty="test"; 
    return View(viewModel); 
} 

Альтернатива также может быть тяготы общего параметра типа (что экономит накладные расходы на отражении) содержит конструктор по умолчанию через TViewModel : MyBaseClass, new(), а затем:

public virtual async Task<IActionResult> Index() 
{ 
    TViewModel viewModel = new TViewModel(); 
    viewModel.MyProperty="test"; 
    return View(viewModel); 
} 
+1

Спасибо. Глупая ошибка. У меня было это как объект. – firste

Смежные вопросы