Necesito para establecer dinámicamente los valores en un grupo o propiedades de un objeto, llamar a un objeto de transmisión.

Habrá un buen número de estos transmisión de los objetos que serán creadas y tienen sus propiedades en un corto espacio de tiempo. Quiero evitar el uso de la reflexión.

Hay alternativas? Si es así hay implementaciones de ejemplo yo podría mirar?

  • Ninguna razón por qué usted quiere evitar el reflejo?
InformationsquelleAutor AndyMM | 2009-06-22

6 Comentarios

  1. 28

    Uso Delegado.CreateDelegate a su vez un MethodInfo en un establecimiento inflexible de tipos delegado. Esto puede mejorar el rendimiento masivamente. Tengo un entrada de blog acerca de este con el código de ejemplo. Tenga en cuenta que esto es sólo va a ayudar si usted necesita para establecer las mismas propiedades varias veces – básicamente significa que una gran cantidad de la comprobación de tipos se realiza una vez al crear el delegado, en lugar de en cada invocación.

    Marc Gravell tiene un HyperPropertyDescriptor proyecto con el que se consigue el mejor rendimiento, pero introduce un extra de dependencia. Este proyecto se convirtió en el punto de partida para las más modernas Rápido Miembro (github). En general, usted usaría Rápido Miembro más de HyperProperty.

    • Lo consiguió gracias msmvps.com/blogs/jon_skeet/archive/2008/08/09/…
    • Eso es mucho mejor, a continuación, tratando de hacer un método Dinámico
    • Tengo algunos interesantes ejemplos de ello .NET 4.0 con DLR árboles – esperemos que para el artículo ;-p
  2. 6

    En .NET 4.0 (beta), usted puede hacer esto con la actualización de la expresión de árboles, el uso Expression.Block y Expression.Assign – a continuación, compilar que a un tipo de delegado; trabajo hecho.

    En .NET 2.0 y superiores (como Jon mencionado) HyperDescriptor es una opción razonable – que funciona como una costumbre PropertyDescriptor aplicación, por lo que usted acaba de hacer un código como:

    //store this collection for optimum performance
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(
        typeof(SomeType));
    props["Name"].SetValue(obj, newName);
    props["DateOfBirth"].SetValue(obj, newDoB);

    Esto todavía tiene un poco de boxeo, pero que no es en realidad un cuello de botella.

  3. 3

    Reflexión puede ser extraordinariamente rápido si lo haces bien (no tan rápido como el de código estático, por supuesto).

    Encontrar una propiedad-setter es lento. La invocación de un delegado es rápido.

    Usted necesita para obtener y caché Delegate objetos para cada propiedad-setter en cada tipo de DTO. Esa es la parte lenta, pero es una de una hora de golpear. A continuación, puede Invoke cada uno de los almacena en caché los delegados de la propiedad-incubadoras de un determinado DTO tipo, pasando en el DTO objeto y el nuevo valor de la propiedad, pero esta parte va a ser muy rápido.

    • Gracias de Justicia voy a probar tu idea.
  4. 0

    Ha establecido con certeza que el uso de la reflexión es demasiado lento? Aunque la reflexión .NET es no tan rápido como de código estático, todavía es muy rápido. Usted debe escribir el código de la forma más sencilla posible – incluso si utiliza la reflexión – y sólo volver a optimizar si observa problemas de rendimiento y aislar a su uso de la reflexión. La mayoría del tiempo, usted no tendrá ningún problema. La reflexión se utiliza en todos los tipos de rendimiento sensible código, tales como ASP.NET MVC.

    • Supongo que lo que estoy buscando es la implementación más rápida posible. Yo también estoy buscando alternativas, simplemente, para realizar la diligencia debida. No quiero estar atado de pies y manos en una técnica , simplemente porque es el que yo conozco, sin explorar alternativas.
  5. 0

    Reflexión tiene una mala reputación a partir de Java donde está (o al menos solía ser) muy lento. Este no es el caso .net así que no entiendo tu objeción sobre el uso de la misma. También estoy de acuerdo con Rex, no se puede decir que algo tiene mal rendimiento sin medición.

    • No he dicho que había un rendimiento pobre , me implicado ! bromas a un lado por favor, véase el comentario a rex.
    • Depende de lo que quieres decir con «muy lento». Se puede muy fácilmente ser un cuello de botella si se utiliza ingenuamente… pero con un poco de trabajo (por ejemplo, Delegado.CreateDelegate y similares) puede ser bastante ágil.

Dejar respuesta

Please enter your comment!
Please enter your name here