2010-11-25 18 views
1

Ich bin durch den ObjectStateEntry von EF Schleife, so dass ich ennty.Entity zugreifen kann, mache ich einige statische Validierung auf die Poco-Klassen und ich möchte auch Business Rule Validierung, so dass ich eine Bibliothek zu tun dass, jetzt habe ich diese Codezeile, die eine Art excample Kunden erwarten ..Pass-Typ zu generischer Klasse

MyEntityValidator<needtypehere> ev = new MyEntityValidator<needtyehere>(new EntityValidator()); 

so habe ich vorbei Typ Problem, wo ich ‚needtypehere‘ mentiened. Ich habe versucht, entry.Entity.GetType(), aber nicht funktioniert. Auch dies ist die signiture des Verfahrens

GetErrors(this ObjectStateEntry entry) 

Antwort

5

Um Generika von einer Type Instanz aufrufen, würden Sie verwenden müssen:

Type closedType = typeof(MyEntityValidator<>) 
     .MakeGenericType(entry.Entity.GetType()); 
object obj = Activator.CreateInstance(closedType); 

das ist ... ungeschickt - wie man dann viel tun müssen, zusätzlicher Arbeit mit Reflexion. Alternativ können Sie in ein generisches Methode aufrufen, die den Code tut:

public static void InvokeGeneric<T>(...) { 
    MyEntityValidator<T> ev = new MyEntityValidator<T>(
     new EntityValidator()); 
    ... etc; lots more code that uses ev 
} 
... 
typeof(ContainingType).GetMethod("InvokeGeneric").MakeGenericMethod(
    entry.Entity.GetType()).Invoke(null, args); 
+0

@saurabh: Marc hat Recht; Die Verwendung eines Laufzeittyps (eine Instanz der Klasse "Type"), um einen Verweis auf einen generischen Typ zu erhalten, ist umständlich und im Allgemeinen nicht im Sinne tatsächlicher Generika. Wenn Sie die Typstruktur steuern, dann bedeutet die Tatsache, dass Sie dies tun müssen (und legitim auf Ihre Klasse verweisen und mit ihr auf typenunabhängige Weise interagieren können), dass es wahrscheinlich eine nicht-generische Basisklasse und dann generische Unterklassen geben sollte . –

Verwandte Themen