vb.net - unity - reflection c#
Invocar dinĂ¡micamente propiedades por nombre de cadena usando VB.NET (3)
Actualmente estoy trabajando en un proyecto donde una sección del código se ve así:
Select Case oReader.Name
Case "NameExample1"
Me.Elements.NameExample1.Value = oReader.ReadString
....
Case "NameExampleN"
Me.Elements.NameExampleN.Value = oReader.ReadString
....
End Select
Continúa por un tiempo. El código es obviamente detallado y parece que podría mejorarse. ¿Hay alguna forma de invocar dinámicamente una propiedad en VB.NET para que se pueda hacer algo como esto?
Dim sReadString As String = oReader.ReadString
Me.Elements.InvokeProperty(sReadString).Value = sReadString
No puedo creer que los otros carteles te dijeran que usaras el reflejo. VB como una función CallByName que hace exactamente lo que quieres.
Otros han respondido de forma perfectamente razonable, pero por si acaso se trata de una pieza de código sensible al rendimiento, es posible que desee compilar las llamadas reflexivas en delegados.
Tengo una entrada de blog sobre convertir MethodBase.Invoke en delegados. El código está en C #, pero la misma técnica se puede aplicar a VB.NET también. Para usar esto con propiedades, obtenga el método "setter" apropiado con PropertyInfo.GetSetMethod y luego cree un delegado que invoca eso. Puede tener un mapa del nombre del campo a "delegar para llamar para establecer el campo".
Solo para reiterar, esto solo es realmente necesario si se trata de una pieza de código de rendimiento crítico. De lo contrario, es posible que aún desee crear un Dictionary<string, PropertyInfo>
para evitar llamar GetProperty
muchas veces, pero el paso para convertirlo en un delegado probablemente no valga la pena preocuparse.
Sí, CallByName es la mejor solución para ti. Aquí hay instrucciones de hacerlo:
CallByName(yourClassOrObjectName,"NameExample1",CallType.Set,oReader.ReadString)
Puede escribir "NameExample" en lugar de "NameExample1".
Mencione, ese tercer parámetro le permite ''Obtener'', ''Dejar'' ese parámetro (e incluso invocar cualquier método).
Para que pueda obtener el valor de su parámetro con CallType.Get
.