C#根据参数类型从基构造函数实例化派生类

Mau*_*que 0 c# hierarchy

我有以下模型(简化):

数据库模型:

public abstract class Question
{
    public int Id { get; set; }
    public string Text { get; set; }
}

public class QuestionA : Question
{
    public bool OptionA { get; set; }
}

public class QuestionB : Question
{
    public int OptionB { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

查看模型:

public abstract class QuestionModel
{
    public string Text { get; set; }

    protected QuestionModel(Question question)
    {
        Text = question.Text;
    }
}

public class QuestionAModel : QuestionModel
{
    public bool OptionA { get; set; }

    public QuestionAModel(QuestionA questionA) : base(questionA)
    {
        OptionA = questionA.OptionA;
    }
}

public class QuestionBModel : QuestionModel
{
    public int OptionB { get; set; }

    public QuestionBModel(QuestionB questionB) : base(questionB)
    {
        OptionB = questionB.OptionB;
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上是将数据库实体映射到视图模型,例如,我有这个控制器:

public class SomeController : Controller
{
    public JsonResult Get()
    {
        // Simulating questions from the database
        var questions = new List<Question>
        {
            new QuestionA { Id = 1, OptionA = true, Text = "fooA" },
            new QuestionB { Id = 1, OptionB = 1, Text = "fooB" }
        };

        var model = questions.Select(q => new QuestionModel(q)).ToList();

        return Json(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然不能编译,因为 new QuestionModel(q)

我知道数据库中每个问题的类型,如何创建每个问题实体的派生问题模型?

谢谢大家!!

use*_*689 5

不是调用构造函数,而是创建一个工厂类该类将根据您必须创建的对象的类型提供正确的实现。

请注意,在调用工厂之前,您必须从数据库中具体化您的对象:

var model = questions.ToList().Select(q => QuestionFactory.CreateQuestion(q));
Run Code Online (Sandbox Code Playgroud)