基于参数类型从基构造函数实例化派生类

本文关键字:构造函数 实例化 派生 于参数 参数 类型 | 更新日期: 2023-09-27 18:17:24

我有以下模型(简化):

数据库模型:

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; }
}

视图模型:

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;
    }
}

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

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

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

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

谢谢大家!!

基于参数类型从基构造函数实例化派生类

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

请注意,在调用工厂之前,必须从DB实现对象:

var model = questions.ToList().Select(q => QuestionFactory.CreateQuestion(q));

当我试图为你的问题找到一个替代解决方案时,我遇到了一个问题,我希望有人能回答我。

下面的代码工作得很好,我声明了一个QuestionA对象并创建了一个上述类型(a)的QuestionModel,最后将其添加到泛型QuestionModel类型的列表中。

QuestionA qA = new QuestionA { Id = 1, OptionA = true, Text = "fooA" };
List<QuestionModel> lst = new List<QuestionModel>();
lst.Add(new QuestionAModel(qA));

然而,假定这段代码遵循相同的逻辑,但我不能编译它

List<QuestionModel> model = new List<QuestionModel>();
questions.ForEach(q => model.Add(q.GetType().Equals(typeof(QuestionA)) ?
     new QuestionAModel((QuestionA)q) : new QuestionBModel((QuestionB)q)));

我很抱歉偏离了OP的问题

编辑:因此,从技术上讲,下面的代码将使您能够创建泛型questionmodel列表,而无需修改类
var questions = new List<Question>
{
   new QuestionA { Id = 1, OptionA = true, Text = "fooA" },
   new QuestionB { Id = 1, OptionB = 1, Text = "fooB" }
};
List<QuestionModel> model = new List<QuestionModel>();
questions.ForEach(q => model.Add(q.GetType().Equals(typeof(QuestionA)) ?
            (QuestionModel)(new QuestionAModel((QuestionA)q)) : new QuestionBModel((QuestionB)q)));