2010-05-13 44 views
10

En C# 4.0, tenemos el tipo dinámico, pero ¿cómo invocar el método estático del objeto de tipo dinámico?¿Cómo invocar el método estático en C# 4.0 con el tipo dinámico?

El siguiente código generará una excepción en el tiempo de ejecución. El objeto dinámico pertenece a la clase C#, pero podría ser objeto de otros idiomas a través de DLR. El punto no es cómo invocar el método estático, sino cómo invocar el método estático del objeto dinámico 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, dinámica se inventó para tender un puente sobre C# y otros lenguajes de programación. Existe algún otro lenguaje (por ejemplo, Java) que permite invocar el método estático a través del objeto en lugar del tipo.

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

Respuesta

6

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); 
8

Mientras que C# no lo admite, el DLR sí. Puede acceder mediante programación a las llamadas dlr con Dynamitey

var staticContext = InvokeContext.CreateStatic ; 

Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3)); 
Cuestiones relacionadas