Question

Je travaille actuellement sur un projet dans lequel une section du code se présente comme suit:

Select Case oReader.Name
    Case "NameExample1"
        Me.Elements.NameExample1.Value = oReader.ReadString
    ....
    Case "NameExampleN"
        Me.Elements.NameExampleN.Value = oReader.ReadString
    ....
End Select

Cela continue pendant un moment. Le code est évidemment bavard et il a le sentiment qu’il pourrait être amélioré. Existe-t-il un moyen d'invoquer de manière dynamique une propriété dans VB.NET de telle sorte que cela puisse être fait:

Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
Était-ce utile?

La solution

D'autres ont répondu de manière parfaitement raisonnable, mais dans le cas où il s'agirait d'un morceau de code sensible aux performances, vous souhaiterez peut-être compiler les appels de réflexion dans les délégués.

J'ai un entrée de blog sur le fait de MethodBase.Invoke en délégués. Le code est en C #, mais la même technique peut également être appliquée à VB.NET. Pour utiliser cela avec les propriétés, procurez-vous le & Quot; setter & Quot; méthode avec PropertyInfo.GetSetMethod et ensuite construit un délégué qui invoque cela. Vous pourriez avoir une carte du nom de champ à & Quot; déléguer à appeler pour définir le champ & Quot;.

Je le répète, cela n’est vraiment nécessaire que s’il s’agit d’un élément de code essentiel à la performance. Sinon, vous voudrez peut-être créer un Dictionary<string, PropertyInfo> pour éviter d'appeler GetProperty plusieurs fois, mais la procédure pour le convertir en délégué ne vaut probablement pas la peine de s'inquiéter.

Autres conseils

Je ne peux pas croire que les autres affiches vous ont dit d'utiliser la réflexion. VB en tant que fonction CallByName qui le fait exactement ce que vous voulez.

Oui, CallByName est la meilleure solution pour vous. Voici les instructions pour le faire:

CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)

Vous pouvez écrire " NameExample " à la place de " NameExample1 " ;.
Mentionnez, ce troisième paramètre vous permet d’obtenir, d’obtenir, et même d’invoquer une méthode.
Vous pouvez donc obtenir la valeur de votre paramètre en utilisant CallType.Get.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top