2010-11-25 19 views
1

Je suis en boucle à travers ObjectStateEntry de EF afin que je puisse accéder à enrty.Entity, je fais une validation statique sur les classes poco et je veux aussi faire la validation des règles métier donc j'ai créé une bibliothèque à faire que, maintenant j'ai cette ligne de code qui attendent un type excample client ..passer le type à la classe générique

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

donc j'ai le type de problème qui passe où je mentiened « needtypehere ». J'ai essayé entry.Entity.GetType() mais ne fonctionnait pas. Encore une fois c'est la signiture de la méthode

GetErrors(this ObjectStateEntry entry) 

Répondre

5

Pour appeler génériques d'une instance Type, vous devez utiliser:

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

qui est ... maladroit - comme vous devez alors faire beaucoup de travail supplémentaire avec réflexion. Vous pouvez également appeler dans une méthode générique qui fait le code:

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 a raison; utiliser un type d'exécution (une instance de la classe 'Type') pour obtenir une référence à un type générique est gênant et généralement pas dans l'esprit des génériques réels. Si vous contrôlez la structure de type, alors le fait que vous devez le faire (et peut légitimement référencer votre classe et interagir avec elle de manière agnostique) signifie qu'il devrait probablement y avoir une classe de base non générique, puis des sous-classes génériques . –