Type de classe de distribution à l'exécution dans VB.NET

.net casting dapper runtime vb.net

Question

J'ai examiné des dizaines de réponses, et trois d' entre elles semblent vraiment proches de ce que j'essaie de réaliser.

J'ai une base de données avec des centaines de vues. J'utilise Dapper pour interroger les résultats d'une vue. Je présente les résultats dans une grille. Ceci est une opération en lecture seule. Les résultats de la vue sont déjà associés à des classes. Voici une requête typique:

queryResults = conn.Query(Of vw_EmployeeProductDetails)(queryString, Nothing)

En ce moment, j'ai une requête séparée pour chaque vue (chacune dans sa propre fonction). Je préférerais passer le queryString et un "ViewType" à une seule fonction pour obtenir des résultats.

'pass Type as function parameter
Dim ViewType = GetType(vw_EmployeeProductDetails)
SelectView(queryString, ViewType)

'...

'in the generic query function:
queryResults = conn.Query(Of ViewType)(queryString, Nothing)

Cependant, cela ne compilera pas et je reçois l'erreur "Type 'ViewType' n'est pas défini."

J'ai essayé de créer une instance de la classe spécifique, puis de passer ce type. J'ai utilisé Activator.CreateInstance dans plusieurs configurations. J'ai essayé d'utiliser MakeGenericType . J'ai essayé de mettre explicitement les résultats dans une liste de "ViewType":

Dim ViewType = GetType(List(Of )).MakeGenericType(GetType(vw_EmployeeProductDetails))
Dim list = Activator.CreateInstance(ViewType)
list = conn.Query(queryString, Nothing)

Aucune de ces réponses (avec plus d'impasses) n'a fonctionné. Le code ci-dessus m'a ramené à la case départ (un objet générique qui ne peut pas être facilement affiché dans une grille, même si les propriétés correctes sont toutes là, sans le renvoyer dans un ensemble de données / datatable).

Je lis plus sur les types génériques pour voir si je peux obtenir que le compilateur reconnaisse le type dans Query(Of ViewType) , mais je ne peux toujours pas comprendre comment le rassembler ou si cette approche fonctionnerait (par exemple, tous mes ViewTypes hériter de la classe générique?).

Ce code ne sera pas compilé pour la même raison:

Dim ViewType= GetType(List(Of )).MakeGenericType(GetType(vw_EmployeeProductDetails))
Dim list = Activator.CreateInstance(ViewType)
Dim list2() As List(Of ViewType)

Lors de la création list2 , ViewType n'est pas défini. Je suis absolument perdu sur la façon de le définir, si c'est même possible, ou si je devrais supprimer toute l'approche.

Quelqu'un peut-il donner un aperçu si cela est possible? Si oui, comment puis-je l'implémenter? Sinon, existe-t-il une alternative appropriée dans cette situation?

Réponse acceptée

Votre fonction de requête générique doit accepter un paramètre de type générique:

 Public Function MyQueryFunction(Of T)(queryString As String) As List(Of T)
    return conn.Query(Of T)(queryString, Nothing)
 End Function

Et tu appellerais ça comme ça:

  Dim myresults as List(Of vw_EmployeeProductDetails) = MyQueryFunction(Of vw_EmployeeProductDetails)(queryString)



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi