2016-11-11 1 views
0

Ich habe folgende Modell (vereinfacht):C# Instanziieren abgeleitete Klasse von Basiskonstruktor basierend auf Parametertyp

Datenbankmodelle:

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

Ansicht Modelle:

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

Grundsätzlich ist zu Zuordnen von Datenbankeinheiten zum Anzeigen von Modellen, und ich habe beispielsweise diesen Controller:

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

Diese obiously kompilieren nicht, weil die new QuestionModel(q)

ich die Art von jeder Frage aus der Datenbank wissen, wie ich abgeleitete Frage Modelle der jede Frage Einheit schaffen kann?

Danke an alle !!

Antwort

4

Erstellen Sie anstelle des Konstruktors factory class, die die richtige Implementierung basierend auf dem Typ des Objekts, das Sie erstellen müssen, bereitstellen.

Beachten Sie, dass Sie müssen Ihre Objekte aus der DB materialisieren, bevor die Fabrik Aufruf:

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

Schön, ich wi Versuche das jetzt! –

-1

Bei dem Versuch, eine alternative Lösung für Ihr Problem zu finden, stieß ich auf eine Frage, die ich hoffe, jemand beantworten kann für mich.

Der folgende Code funktioniert gut, ich deklariere ein QuestionA Objekt und ein QuestionModel des Typs (A), die ich schließlich zu einer Liste des generischen QuestionModel-Typs hinzufügen.

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

jedoch angeblich folgt dieser Code die gleiche Logik, aber ich kann es nicht kompilieren

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

ich zum Ablenken von OP Frage entschuldigen

EDIT: Also, technisch gesehen, der folgende Code ermöglichen es Ihnen, die Liste der generischen QuestionModels zu erstellen, ohne die Klassen zu ändern

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))); 
+1

Eine Antwort * Antworten * eine Frage. Dies ist keine Antwort. Wenn Sie eine Frage und keine Antwort haben, * fragen * Sie eine Frage. – InBetween

+0

@InBetween Ich halte es für relevant, weil Sie bei der Lösung dieses Problems auch die Frage von OP beantworten. – Innat3

+0

Sei es relevant oder nicht, ist nicht das Problem. Antworten sind für * Antworten *, keine "relevanten" Fragen hinzufügen. – InBetween

Verwandte Themen