2010-05-13 37 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)); 
相關問題