He visto una publicación muy interesante en el blog Fabio Maulo's. Aquí está el código y el error si no quieres saltar a la url. He definido una nueva clase genérica de este modo:
¿Es esto un agujero en la unión dinámica en C# 4?
public class TableStorageInitializer<TTableEntity> where TTableEntity : class, new()
{
public void Initialize()
{
InitializeInstance(new TTableEntity());
}
public void InitializeInstance(dynamic entity)
{
entity.PartitionKey = Guid.NewGuid().ToString();
entity.RowKey = Guid.NewGuid().ToString();
}
}
Tenga en cuenta que InitializeInstance acepta un parámetro, que es de tipo dinámico. Ahora, para probar esta clase, definí otra clase que está anidado dentro de mi clase principal del programa, así:
class Program
{
static void Main(string[] args)
{
TableStorageInitializer<MyClass> x = new TableStorageInitializer<MyClass>();
x.Initialize();
}
private class MyClass
{
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTime Timestamp { get; set; }
}
}
Nota: la clase interna "MyClass" se declara privada.
Ahora si ejecuto este código obtengo un Microsoft.CSharp.RuntimeBinder.RuntimeBinderException en la línea "entity.PartitionKey = Guide.NewGuid(). ToString()".
La parte interesante, sin embargo, es que el mensaje de la excepción dice "El objeto no contiene una definición para PartitionKey".
alt text http://img697.imageshack.us/img697/4188/testdl.png
También tenga en cuenta que si cambió el modificador de la clase anidada a pública, el código se ejecutará sin problemas. Entonces, ¿qué piensan ustedes que realmente está sucediendo bajo el capó? Por favor, consulte la documentación que pueda encontrar, por supuesto, si está documentada en algún lugar.
Yo solía pensar que usar dinámico es una forma abreviada de usar simple reflejo antiguo, aparentemente estoy equivocado porque esto funcionaría bien si reemplazaste el implementación de InitializeInstance para usar la reflexión. ¿Podrías dar más detalles sobre eso, por favor? – Galilyou
@Jon: me temo que todavía no entiendo cómo las matrices se salieron con la no implementación de todas las propiedades de la interfaz (aunque fundirla en un 'IList' te permite llamar a 'Count' !?) - ¿podrías elaborar? ? * (también, ¿quiso decir 'd.Count' más arriba?) * –
No importa, [contesté mi propia pregunta] (http://msdn.microsoft.com/en-us/library/aa288461%28VS.71%29. aspx). –