¿Cómo invocar el método estático en C # 4.0 con tipo dynamic?

En C # 4.0, tenemos un tipo dynamic, pero ¿cómo invocar un método estático de objeto de tipo dynamic?

El código siguiente generará una excepción en el tiempo de ejecución. El objeto dynamic es de la clase C #, pero podría ser objeto de otros idiomas a través de DLR. El punto no es cómo invocar un método estático, sino cómo invocar un método estático de objeto dynamic que no se pudo crear en el código C #.

class Foo { public static int Sum(int x, int y) { return x + y; } } class Program { static void Main(string[] args) { dynamic d = new Foo(); Console.WriteLine(d.Sum(1, 3)); } } 

En mi humilde opinión, la dinámica se inventa para unir C # y otro lenguaje de progtwigción. Hay algún otro lenguaje (por ejemplo, Java) que permite invocar métodos estáticos a través de objetos en lugar de tipos.

Por cierto, la introducción de C # 4.0 no es tan impresionante en comparación con C # 3.0.

C # 4 no lo admite directamente, pero hay una solución interesante en esta publicación del blog: http://blogs.msdn.com/davidebb/archive/2009/10/23/using-c-dynamic-to-call-static- miembros.aspx

Mientras que C # no lo admite, el DLR lo hace. Puedes acceder programáticamente a las llamadas dlr con Dynamitey

 var staticContext = InvokeContext.CreateStatic ; Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3)); 

Una posible solución sería utilizar la reflexión.

 dynamic d = new Foo(); var sum = (int)d.GetType() .GetMethod("Sum") .Invoke(d, new object[] { 1, 3 }); Console.WriteLine(sum);