2010-05-13 66 views
10

在C#4.0中,我们有动态类型,但是如何调用动态类型对象的静态方法?如何在动态类型中调用C#4.0中的静态方法?

下面的代码会在运行时产生异常。对象来自C#类,但它可能是通过DLR从其他语言的对象。重点不在于如何调用静态方法,而是如何调用无法在C#代码中创建的对象的静态方法dynamic

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

    } 
} 

恕我直言,动态的发明填补C#等编程语言。还有一些其他语言(例如Java)允许通过对象而不是类型来调用静态方法。

顺便说一句,与C#3.0相比,C#4.0的引入并不那么令人印象深刻。

回答

6

一个可能的解决方法是使用反射。

dynamic d = new Foo(); 

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

虽然C#不支持它,但DLR的确如此。您可以编程访问的dlr调用Dynamitey

var staticContext = InvokeContext.CreateStatic ; 

Console.WriteLine(Dynamic.InvokeMember(staticContext(typeof(Foo)), "Sum", 1,3)); 
相关问题