如何设置泛型类的基类属性

dev*_*ric 3 c# generics

我有一个基类:

public abstract class MyBaseClass
{
    public string  MyProperty { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

然后是一个传递一个Generic类的类,该类传递一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这就像我想要的那样.但是,一旦我尝试设置基类属性,我得到一个编译错误:

对象不包含该行上MyProperty的定义

viewModel.MyProperty="test";
Run Code Online (Sandbox Code Playgroud)

我该如何设置属性?

Yuv*_*kov 6

使用通用Activator.CreateInstance<T>代替:

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

另一种方法也可以是限制泛型类型参数(这可以节省反射开销)以包含默认构造函数TViewModel : MyBaseClass, new(),然后:

public virtual async Task<IActionResult> Index()
{
    TViewModel viewModel = new TViewModel();
    viewModel.MyProperty="test";
    return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)