2008-10-27 17 views
25

Actualmente estoy trabajando en un proyecto en una sección del código es el siguiente:invocar dinámicamente las propiedades de nombre de la cadena usando VB.NET

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

continúa durante un tiempo. El código es obviamente detallado y se siente como podría mejorarse. ¿Hay alguna forma de invocar dinámicamente una propiedad en VB.NET tales que algo como esto se puede hacer:

Dim sReadString As String = oReader.ReadString 
Me.Elements.InvokeProperty(sReadString).Value = sReadString 

Respuesta

15

Otros han respondido perfectamente razonable, pero en caso de que sea una pieza de código sensible al rendimiento, es posible que desee compilar las llamadas reflexivas en delegados.

Tengo un blog entry sobre cómo 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 construya 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 desee crear un Dictionary<string, PropertyInfo> para evitar llamar al GetProperty muchas veces, pero el paso para convertirlo en un delegado probablemente no vale la pena preocuparse.

+3

CallByName parece más simple. ¿Cómo difiere esto de Reflection en términos de rendimiento? – EndangeredMassa

+0

Creo que CallByName usa Reflection internamente, y sospecho que aplica varias travesuras específicas de VB para compatibilidad con versiones anteriores. Pruébalo, pero dudo mucho que lo veas tan rápido como un delegado. Sí, usar MakeDelegate es más complicado, pero mucho más eficiente que la reflexión. –

+0

el enlace de entrada de su blog está roto – Fredou

30

No puedo creer que los otros carteles te dijeran que usaras el reflejo. VB como una función CallByName que hace exactamente lo que desea.

+7

Santa mierda, ojalá supiera de esto hace años. –

6

Sí ... CallByName

10

Sí, CallByName es la mejor solución para usted. Aquí está la instrucción de hacerlo:

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

Usted puede escribir "NameExample" en lugar de "NameExample1".
Mencione que 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 usando CallType.Get.

Cuestiones relacionadas