2009-09-08 5 views
5

¿Cuáles son las implicaciones de rendimiento de asociar métodos y propiedades en tiempo de ejecución mediante el uso de características dinámicas, como se describe en this blog post?¿Adjunta propiedades y métodos en tiempo de ejecución en C# 4.0?

¿Cuáles son los usos prácticos de ExpandoObject?

+0

posible duplicado de [ ¿Cuáles son los verdaderos beneficios de ExpandoObject?] (Http://stackoverflow.com/questions/1653046/what-are-the-true-benefits-of-expandoobject) – nawfal

Respuesta

10

Bueno, no eres realmente asociando métodos y propiedades al objeto. No en lo que respecta al CLR. Solo está agregando entradas a un diccionario, y cuando se solicita la implementación ExpandoObject de IDynamicMetaObjectProvider para obtener el valor de la propiedad (o se le pide que ejecute el método), actuará en consecuencia.

El rendimiento obviamente va a ser más lento que el acceso estáticamente ligado a los métodos/propiedades, pero el DLR es bastante nippy. Mi preocupación personal no es tanto el rendimiento como la falta de seguridad del tipo: un error tipográfico puede atornillar fácilmente el código sin que el compilador lo detecte.

Mi consejo personal es utilizar solo la escritura dinámica en C# 4, donde ofrece un beneficio muy claro ... que espero que sea relativamente raro (como un código inseguro).

¿Usos para ExpandoObject? No muchos, IMO, principalmente cuando se habla con otros lenguajes dinámicos.

+0

Whoa, esto comienza a parecerse a la programación basada en prototipos. Además de eso, ¿podría usarse para emular la inyección de clase base [por ensamblaje]? –

+3

Relativamente raro ?! Usted señor, no es un programador de Ruby :) –

+3

@Paul: De hecho ... porque estamos hablando de C#, en lugar de Ruby. Como un lenguaje básicamente estáticamente tipado, creo que será relativamente raro convertir C# en una mezcolanza de tipeo estático y dinámico. Si desea utilizar la escritura dinámica extensivamente, use IronRuby o IronPython ... –

2

ExpandoObject se relaciona con el DLR, y está relacionado principalmente para jugar entre C# y un lenguaje dinámico (quizás IronPython); sin embargo, de manera más general, este tipo de objeto de bolsa de propiedades puede ser útil cuando el esquema de sus tipos solo se conoce en tiempo de ejecución, tal vez en función de datos de datos/datos de configuración. Tal vez un ejemplo del patrón de "plataforma interna", pero es útil en los escenarios específicos para adjuntar propiedades en tiempo de ejecución. Por supuesto, para un uso puramente CLR (es decir, no hay personas que llaman DLR) que puede hacer esto mucho más simplemente con un indexador y el diccionario:

obj["Name"] = "Fred"; 
string name = (string) obj["Name"]; 

Para los propósitos de enlace de datos, incluso con este se puede lograr el enlace de datos completos utilizando descripciones de propiedad personalizadas, a través de ICustomTypeDescriptor o TypeDescriptionProvider.

O para un sencillo ejemplo: considere DataTable ... esto es en parte lo que puede hacer aquí (de nuevo, en el código tecleado-estática): (ejemplo no probado)

DataTable table = new DataTable(); 
table.Columns.Add("Name", typeof(string)); 
DataRow row = table.Rows.Add("Fred"); 
Cuestiones relacionadas