2009-05-15 12 views
2

I Entitätsmodell mit einer SQL-DB verwenden, und ich habe eine Menge von etwa 30 Lookup-Tabellen, die in dem gleichen Spalte 3-Format sind, ID, Text, IsActive. Aber anstatt 30 Formulare zu erstellen, würde ich gerne ein Formular erstellen und je nach dem String-Namen eines gegebenen Typs, dann füllen Sie eine Gridview und ermöglichen die Fähigkeit Einfügen, Update oder Löschen Datensätze dieses Typs.Arbeiten mit dynamischen Typen

ich versucht habe

string objectType = "Namespace.Models.BenefitType"; 
object o = Assembly.GetExecutingAssembly().CreateInstance(objectType); 
Type t = o.GetType(); 

aber ich kann den Typ nicht zugreifen, erhalte ich eine Mitteilung über sie eine Art von System.Type nicht BenefitType zu sein.

Kann mir jemand sagen, wie ich einen Typ, der unbekannt ist, bis er dynamisch aufgerufen wird.

Vielen Dank

Antwort

0

Im Moment sind Ihre Möglichkeiten begrenzt. Das Framework muss in der Lage sein, mehr über Typinformationen als nur einen String-Namen zur Kompilierzeit zu wissen, um sie einfach verwenden zu können. Das bedeutet, dass Sie etwas wie eine switch-Anweisung für Ihre Typzeichenfolge tun müssen, was nicht sehr nett ist, oder dafür zu sorgen, dass alle Ihre dynamischen Typen eine gemeinsame Schnittstelle implementieren, auf die Sie zurückgreifen können (viel besser).

In C# 4.0 können Sie das Schlüsselwort dynamic verwenden, um diese Aufrufe zur Laufzeit aufzulösen.

+0

Danke für den Rat Joel – user107779

1

Ich würde definitiv mit einer Schnittstelle und dann eine generische Art (oder generische Methoden) gehen, anstatt Dinge wirklich dynamisch zu tun, wenn Sie können. Wenn Ihr automatisch generierten Code Teilklassen gebildet wird, das ist wirklich einfach zu tun - schreiben Sie einfach die Schnittstelle um, was hast du zur Zeit kam, und dann eine neue Datei hinzufügen, mit:

public partial class BenefitType : ICommonType {} 
public partial class OtherType : ICommonType{} 
// etc 

Dann können Sie schreiben:

public class LookupForm<T> : Form where T : ICommonType, new() 

und du bist weg. Der Nachteil ist, dass der Designer nicht allzu glücklich mit generischen Typen ist.

Wenn Sie zu Verwendung dies basiert nur auf dem Typnamen, können Sie das tun:

string objectType = "Namespace.Models.BenefitType"; 
Type type = Type.GetType(objectType); 
Type formType = typeof(LookupForm<>).MakeGenericType(type); 
Form form = (Form) Activator.CreateInstance(formType); 

Sie könnte eine abstrakte nicht generische Form zwischen LookupForm<T> erstellen möchten und Form dem Du in stark typisierter Weise verwenden, was aber nichts mit T zu tun hat. Es hängt davon ab, was genau Sie tun müssen.

+0

Danke Jon, ich werde versuchen, dies durchzuarbeiten – user107779

Verwandte Themen