propriedades dinamicamente Invoque por nome string usando VB.NET
-
04-07-2019 - |
Pergunta
Atualmente estou trabalhando em um projeto onde uma seção dos olhares código como este:
Select Case oReader.Name
Case "NameExample1"
Me.Elements.NameExample1.Value = oReader.ReadString
....
Case "NameExampleN"
Me.Elements.NameExampleN.Value = oReader.ReadString
....
End Select
Ele continua por um tempo. O código é, obviamente, detalhado e sente como ele poderia ser melhorado. Existe alguma maneira para dinamicamente chamar uma propriedade em VB.NET tal que algo como isso pode ser feito:
Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
Solução
Outros têm respondido perfeitamente razoável, mas apenas no caso de este é um pedaço de código sensíveis ao desempenho, você pode querer compilar as chamadas reflexivas em delegados.
Eu tenho um href="http://codeblog.jonskeet.uk/2008/08/09/making-reflection-fly-and-exploring-delegates" rel="nofollow noreferrer"> blog sobre o giro MethodBase.Invoke em delegados. O código é em C #, mas a mesma técnica pode ser aplicada a VB.NET bem. Para usar este com propriedades, obter o apropriado método "setter" com PropertyInfo.GetSetMethod e então construir um delegado que chama isso. Você poderia ter um mapa do nome do campo para "delegado para chamar para definir o campo".
Apenas para reiterar, este só é realmente necessário se ele está em um pedaço de código de desempenho crítico. Caso contrário, você ainda pode querer criar um Dictionary<string, PropertyInfo>
para evitar chamar GetProperty
muitas vezes, mas o passo para convertê-lo em um delegado provavelmente não vale cerca de preocupante.
Outras dicas
Eu não posso acreditar que os outros cartazes disse para usar a reflexão. VB como um CallByName função que faz exatamente o que você quer.
Sim, CallByName é a melhor solução para você. Aqui é a instrução de fazê-lo:
CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)
Você pode escrever "NameExample" no lugar de "NameExample1".
Menção, que o terceiro parâmetro permite 'Get', 'Let' esse parâmetro (e até mesmo invocar qualquer método).
Assim, você pode obter o valor do seu parâmetro usando CallType.Get
.