2016-04-25 8 views
4

Ich habe einen generischen Controller, dem ich eine Klasse mit nur Eigenschaften überlasse. Alles funktioniert gut, aber ...Erstelle geerbte Klasse vom Typ Parameter

Ich möchte eine andere Klasse in der Controller-Klasse erstellen, die die übergebene Klasse erbt.

Art wie folgt aus:

public class Products 
{ 
    public Int32 ProductID {get; set;} 
    public String ProductName {get; set;} 
} 

public class ProductController : Controller<Products> 
{ 
    public ProductsController() : base("Products", "ProductID", "table", "dbo") 
    { 
    } 
} 

public class Controller<T> : IDisposable where T : new() 
{ 
    protected Controller(String tablename, String keyname, String entitytype, String tableschema = "dbo") 
    { 
     ... 
    } 

    //How do I create the Recordset class inheriting T 
    public class Recordset : T //<----This is what I don't know how to do 
    { 
     public Int32 myprop {get; set;} 

     public void MoveNext() 
     { 
      //do stuff 
     } 
    } 
} 

Wie kann ich die Klasse-Cord mit T erstellen als geerbt?

+1

Haben Sie auch versucht, die 'where T: Klasse, new()'? Sie können Strukturen nicht erben. –

+0

@Chris: Werfen Sie einen Blick auf "ImpromptuInterface" auf Nuget, das neue Typen im laufenden Betrieb erstellen kann, die sich wie andere Typen verhalten; aber du willst wirklich nicht dorthin gehen. Siehe auch https://en.wikipedia.org/wiki/Composition_over_inheritance –

+0

Danke, Berin. Das war's. Dachte ich habe das vorher gemacht aber ... Lösung unten. – Chris

Antwort

6

Der Compiler won't let you do that (wie ich die Nachricht, die Sie gesagt, Fehler sicher bin):

nicht aus ‚Bezeichner‘ ableiten kann, weil es ein Typparameter
Basisklassen oder Schnittstellen für generische Klassen ist nicht können durch einen Typparameter angegeben werden. Leiten Sie sich stattdessen von einer bestimmten Klasse oder Schnittstelle oder einer bestimmten generischen Klasse ab oder schließen Sie den unbekannten Typ als Mitglied ein.

Sie Einkapselung statt Vererbung verwenden:

public class Controller<T> : IDisposable where T : new() 
{ 
    public class RecordSet 
    {  
     private T Records; 

     public RecordSet(T records) 
     { 
      Records = records; 
     }   

     public void MoveNext() 
     { 
      // pass through to encapsulated instance 
      Records.MoveNext(); 
     }    
    } 
} 
+0

Nein, es ist eine verschachtelte Klasse, so dass es für "free" - es ist ein 'Controller .RecordSet' – Blorgbeard

+0

Ah, ich hatte angenommen, OP hatte nur die Klammern vermasselt. – DavidG

+0

Nein! Keine Klammerproblem! :) – Chris

0

Sie können tun, dass Klassen unter Reflection.Emit Namespace. Aber wenn Sie so weit graben, werden Sie wahrscheinlich herausfinden, dass Sie keine Erbschaft brauchen.

+0

Möchten Sie ein Beispiel geben? Danke! – Chris

0
public class Controller<T> : IDisposable where T : class, new() 
{ 
    protected Controller(String tablename, String keyname, String entitytype, String tableschema = "dbo") 
    { 
     ... 
    } 
    public class Recordset<TT> where TT : class, new() 
    { 
     public TT myinheritedclass {get; set} 
     public Int32 myprop {get; set;} 

     public void MoveNext() 
     { 
      //do stuff 
     } 
    } 

    public Recordset<T> myRecordset = new Recordset<T>() 
} 
Verwandte Themen