2010-05-13 3 views
10

En C# 4.0, nous avons un type dynamique, mais comment appeler une méthode statique d'un objet de type dynamique?Comment appeler la méthode statique en C# 4.0 avec un type dynamique?

Le code ci-dessous génère une exception lors de l'exécution. L'objet dynamic provient de la classe C#, mais il peut être objet d'autres langues via DLR. Le point n'est pas comment appeler la méthode statique, mais comment appeler la méthode statique objet dynamique qui n'a pas pu être créé en code 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)); 

    } 
} 

à mon humble avis, dynamique est inventée pour combler C# et d'autres langages de programmation. Il existe un autre langage (par exemple Java) qui permet d'appeler une méthode statique via un objet au lieu du type.

BTW, L'introduction de C# 4.0 n'est pas si impressionnante par rapport à C# 3.0.

Répondre

6

Une solution possible serait d'utiliser la réflexion.

dynamic d = new Foo(); 

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

Bien que C# ne le supporte pas, le DLR le fait. Vous pouvez accéder par programme aux appels dlr avec Dynamitey

var staticContext = InvokeContext.CreateStatic ; 

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