2016-06-03 8 views
2

Ich versuche, das Builder-Muster zu verwenden, und ich habe in eine Not geraten, die ich vorher nicht getroffen habe. Ich versuche Generika in die Builder-Optionen zu integrieren.T Generics arbeitet nicht mit Builder-Muster

public class ObjectBuilder 
{ 
    private object_collectionModelType; 
    //private Type_collectionModelType; 


    public void Build() 
    { 
     var x = CreateCollection<typeof(_collectionModelType)>(...); 
    } 


    //helper 
    private Collection<T> CreateCollection<T>(...) 
    { 
    ... 
    } 
} 

Es mag es nicht, mir die _collectionModelType vorbei ist der Fehler:

_collectionModelType ist ein Feld, sondern als eine Art verwendet.

Nun ja Visual Studio Compiler Sie sind richtig und ich möchte es beheben, aber nicht wie?

Irgendwie brauche ich den Erbauer, um zu erlauben, dass ein Basisobjekt oder ein System.Type als Teil der Konfiguration übergeben wird, das dem privaten Unterstützungsfeld zugewiesen wird und dann in der Errichtungsmethode benutzt wird.

+0

Denken Sie daran, dass C# eine statisch typisierte Sprache ist. Es wäre unmöglich für den Compiler, einen statischen Typ für "x" in diesem Code bereitzustellen. – Enigmativity

Antwort

4

Wäre das nicht ausreichend?

public void Build<CMT>() 
{ 
    var x = CreateCollection<CMT>(...); 
} 

Wenn Sie nicht möchten, dass die Art in der Build() Methode angeben, dies zu tun:

public class ObjectBuilder<CMT> 
{ 

    public void Build() 
    { 
     var x = CreateCollection<CMT>(...); 
    } 

Das ist nur die gleiche funktionieren würde, aber Sie haben den Typ angeben, wenn Sie erstellen die ObjectBuilder mit einem Konstruktor und die ObjectBuilder Instanz wird nicht in der Lage sein zu ändern, so dass nur CMT wäre möglich zu bauen.

Wenn Sie etwas flexibler sehen wollen, schauen Sie sich das Factory-Muster oder das Abstract Factory-Muster an. Beide sind sehr leistungsfähig, wenn sie korrekt mit einer generischen Schnittstelle implementiert werden.

+0

Ohh ja .... ich denke es würde. Ich beschränkte meine Gedanken auf eine Kiste. Lass es mich versuchen. – GPGVM

0

Bitte überprüfen Sie dies, ich habe dies getestet und es funktioniert. Ich bin mir nicht sicher, ob Sie danach suchen.

namespace StackOverFlow 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ObjectBuilder<string> stringObjectBuilder = new ObjectBuilder<string>(); 
      Collection<string> stringCol = stringObjectBuilder.Build(); 
      foreach (string s in stringCol) Console.WriteLine(s); 
      ObjectBuilder<double> doubleObjectBuilder = new ObjectBuilder<double>(); 
      Collection<double> doubleCol = doubleObjectBuilder.Build(); 
      foreach (double d in doubleCol) Console.WriteLine(d); 
      Console.ReadKey(); 

     } 
    } 
    public class ObjectBuilder<T> 
    { 
     private object _collectionModelType; 
     //private Type_collectionModelType; 
     public ObjectBuilder() 
      { 

      } 

     public Collection<T> Build() 
     { 
      //_collectionModelType = collectionTypeToBuild; 
      var x = CreateCollection(); 
      return x; 
     } 


     //helper 
     private Collection<T> CreateCollection() 
     { 
      Collection<T> objCol = new Collection<T>(); 
      objCol.Add(default(T)); 
      return objCol; 
     } 
    } 
}