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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top