Invoquer dynamiquement des propriétés par nom de chaîne à l'aide de VB.NET
Je suis actuellement en train de travailler sur un projet dans lequel une section du code ressemble à ceci:
Select Case oReader.Name
Case "NameExample1"
Me.Elements.NameExample1.Value = oReader.ReadString
....
Case "NameExampleN"
Me.Elements.NameExampleN.Value = oReader.ReadString
....
End Select
Il continue pendant un certain temps. Le code est évidemment verbeux et il se sent comme il pourrait être amélioré. Est-il possible d'invoquer dynamiquement une propriété dans VB.NET tels que quelque chose comme cela peut être fait:
Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
Vous devez vous connecter pour publier un commentaire.
D'autres ont répondu parfaitement raisonnable, mais juste au cas, c'est une performance sensible morceau de code, vous pouvez compiler la réflexion des appels dans délégués.
J'ai un l'entrée de blog sur la mise MethodBase.Invoquer dans délégués. Le code est en C#, mais la même technique peut être appliquée à VB.NET ainsi. Pour l'utiliser avec des propriétés, de l' "setter" méthode avec PropertyInfo.GetSetMethod et ensuite construire un délégué qui l'invoque. Vous pourriez avoir une carte de champ nom de "délégué à l'appel pour définir le champ".
Juste pour rappeler, ce n'est vraiment nécessaire, si c'est dans une performance-partie de code critique. Sinon, vous pouvez toujours créer un
Dictionary<string, PropertyInfo>
pour éviter l'appel deGetProperty
de nombreuses fois, mais la première étape pour le convertir en un délégué n'est probablement pas la peine de s'inquiéter au sujet de.Je ne peux pas croire que les autres posters dit d'utiliser la réflexion. VB comme un CallByName fonction qui fait exactement ce que vous voulez.
Oui, CallByName est la meilleure solution pour vous. Voici l'instruction de le faire:
Vous pouvez écrire "NameExample" au lieu de "NameExample1".
Mentionner que troisième paramètre vous permet de 'Get', 'Laissez ce paramètre (et même d'appeler l'une des méthodes).
De sorte que vous pouvez obtenir votre valeur du paramètre à l'aide de
CallType.Get
.