2017-11-04 3 views
0

Weiß jemand, ob es möglich ist, einen Klassentyp dynamisch in eine Klasse zu übergeben, die Type TObject benötigt?Wie übergibt man einen dynamischen Typ an eine Klasse, die <TObject> erfordert

Mein Controller-Klasse wird wie folgt erklärt:

public class DataController<TObject> where TObject : class 

Ich weiß nicht, was „TObject“ wird unter bestimmten Umständen zur Laufzeit sein, also würde ich gerne wissen, ob es einen Weg gibt, etwas zu tun Wie, was ich unten versuche? Zu der Zeit, dieser Code trifft, ich kenne den Typ und es ist in „t“ gespeichert, die ich in diesem Verfahren so bin vorbei:

 private void RefreshGrid(Type t, DataGridView ctl) 
    { 
     DataController<t> cDataController = new DataController<t>(); 

      //... other stuff 

     cDataController = null; 
    } 

Offensichtlich hier die Syntax nicht als „t“ ist eine Variable verwendet, wie ein Typ, sagt der Compiler zu Recht.

Vielen Dank im Voraus.

+1

Können Sie 'RefreshGrid' nicht generisch machen? ('private void RefreshGrid (DataGridView c) wo T: TObject') –

+0

Danke für Ihre Eingabe, aber ich kann nicht sehen, wie das helfen würde. Es spielt keine Rolle, ob die RefreshGrid-Methode vom Typ ist, weil ich den DataController innerhalb der Methode immer noch mit dem realen Objekt instanziieren muss (nicht ). –

+0

Ok, kannst du bitte mehr darüber erklären, wie dein Code funktioniert. In Ihrem Beispiel wird wie und wo 'RefreshGrid' aufgerufen. Sie übergeben keine realen Objekte, nur einen Typ. Sie möchten dann eine neue Instanz erstellen? Können Sie den Anrufcode posten? –

Antwort

0

Ich bin nicht sicher, ob ich völlig Ihre Frage verstanden, aber wenn Sie Instanz geöffnet generischer Typ erstellen möchten, können Sie es tun, indem Activator

private void RefreshGrid(Type t, DataGridView ctl) 
{ 
    var openGenericType = typeof(DataController<>); 
    var genericType = openGenericType.MakeGenericType(t); 
    var instance = Activator.CreateInstance(genericType); //Instance is type of DataController<T> where T is type of "t" 
    //If you need to access instance's members, you can use System.Reflection 
    //Other stuff... 

    instance = null; 
} 

Vielleicht verwenden, können Sie eine bessere Leistung und Lesbarkeit, wenn Sie spezifizieren genauer, was Sie erreichen möchten.

+0

Ich habe eine Klasse, die die Interaktion zwischen den verschiedenen Ansichten in der GUI und den Datenbankelementen steuert, mit denen sie verbunden sind. Tatsächlich gibt es für jede Ansicht eine Klasse, in der ich den Datenbank-Entitätsnamen, den Ansichts-/Formularnamen und den DataGridView-Namen auch im Formular habe. Eigentlich ist meine Klasse in einer Liste dieser Klassen. Ich möchte alle Ansichten aktualisieren, aber ich möchte es nicht individuell machen, ich möchte eine "foreach" für jede Klasseninstanz machen und den "Type"/Entity and Grid in die Refresh-Funktion senden. Ich werde deinen Vorschlag versuchen und vielen Dank. –

+0

Ich habe vergessen zu erwähnen, dass DataController einen Parameter vom Typ DbContext benötigt. Vielen Dank. –

+0

Ich habe die Frage detaillierter hinzugefügt, vielen Dank im Voraus. –

Verwandte Themen