2017-02-10 3 views
-1

ich eine abstrakte Klasse namens FabrikErstellen Instanz eines generischen Typs, der einen Parameter eines sekundären generischen Typ nimmt

Die Fabrik hat eine Methode create()

public abstract class Factory<T, U>{ 

    public T CreateModel(IDictionary<String, Object> parametersDictionary) 
     { 
      T toReturn; 

      if (ValidateDictionary(parametersDictionary) != true) 
       return null; 
      else 
      { 
       toReturn = new T(U); 
      } 


      return toReturn; 
     }} 

In der else-Anweisung, ich will um eine Car-Instanz zu erstellen, die ein CarPart-Objekt nimmt, das ich von einem anderen Methodenaufruf erhalten würde. Diese Logik würde auf andere Factory-Subtypen angewendet werden, daher möchte ich diese Methode erben. Das Problem ist, dass ich die generische Car-Instanz nicht mit einem anderen allgemeinen Parameter erstellen kann.

Ich sah mich um und fand, dass ich die Aktivator-Klasse verwenden könnte.

(T) Activator.CreateInstance (typeof ( Car), args);

Dies scheint jedoch nur zu funktionieren, wenn Sie einen bestimmten Typ haben, den Sie dem Konstruktor geben möchten.

Ich habe auch versucht zu tun:

public abstract class Fabrik, wo T: new()

Aber das mich nicht an den Konstruktor jedes Argument analysieren ließ.

Wie kann ich diese abstrakte Klasse implementieren?

Edit1: verändert die Benennung für die Klärung

EDIT2: Zur Verdeutlichung U eine Struktur, die aproximatelly 20 notwendigen Parameter für die Erstellung von T. Um also einen neuen T erstellen enthält, ich brauche es ein U passieren Objekt, das alle 20 notwendigen Parameter einkapselt.

+1

Was ist 'T'? Ich kann nur Typdefinitionen für 'Car' und' CarPart' sehen. Ich nehme an, 'T' sollte' Car' sein. – HimBromBeere

+0

Frage ist auch nicht klar, wenn Sie Factory benötigen dann geben Sie es nur CarPart-Eingabe, und in CreateModel auflösen, welches Objekt möchten Sie zurückgeben - Factory sollte für Sie entscheiden, was es zurückgeben soll. – Vladimir

+0

Können Sie 'Car's Konstruktor zeigen? Btw .: Ich glaube, Sie sind mit den Namen der Typparameter verwirrt. Ich schlage vor, dass Sie "T" und "U" für den generischen Parameter in Ihrer Factory-Class-Definition verwenden, und dann werden die Dinge klarer, da "Car" sowohl der Name des generischen Parameters als auch der Name eines existierenden Parameters zu sein scheint Klasse. – HimBromBeere

Antwort

0

Nachdem Abion47 darauf hingewiesen hat, dass Activator.CreateInstance keine Probleme haben sollte, was ich tun muss, schaute ich ein bisschen mehr in das Problem und ließ es funktionieren.

Für alle, die sich über diese kommen könnte:

public abstract class Sentinel<T,U> where T: new() where U: new() 
{ 
    public T CreateModel(IDictionary<String, Object> parametersDictionary) 
    { 
     T toReturn ; 

     if (ValidateDictionary(parametersDictionary) != true) 
      return default(T); 
     else 
     { 
      U parameters = ParseDictionaryToParameters(parametersDictionary); 
      toReturn = (T)Activator.CreateInstance(typeof(T), new object[] {parameters}); 
     } 

     //If we got this far then everything should be fine. 
     return toReturn; 
    } 

    public abstract U ParseDictionaryToParameters(IDictionary<String, Object> parametersDictionary); 

    public abstract Boolean ValidateDictionary(IDictionary<String, Object> parametersDictionary); 
} 
Verwandte Themen