2009-07-10 25 views
8

鑑於C#4中的新動態支持,是否有可能編寫一個類,以便如果某個方法在實例和該方法不存在,調度傳遞給另一個方法?這可能看起來像這樣:處理未在動態對象上定義的C#方法(又名respond_to/method_missing)

public class Apple : ... { 
    // ... 

    private ... MethodMissing(string name, ...) { 
    if (name == "TurnIntoOrange") { 
     // do something 
    } 
    } 
} 

dynamic d = new Apple(); 
d.TurnIntoOrange();  // Not actually defined on Apple; will pass to MethodMissing. 

其他語言稱爲「method_missing支持」,在元編程的更一般的標題下。我不確定C#專門調用了哪些內容。但是有可能嗎?

回答

17

絕對如此。執行IDynamicMetaObjectProvider或從DynamicObject派生一個更簡單的路線。一些很好的例子參見DLR documentation

這裏是DynamicObject一個簡單的例子:

using System; 
using System.Dynamic; 

public class MyDynamic : DynamicObject 
{ 
    public override bool TryInvokeMember 
     (InvokeMemberBinder binder, 
     object[] args, 
     out object result) 
    { 
     Console.WriteLine("I would have invoked: {0}", 
          binder.Name); 
     result = "dummy"; 
     return true; 
    } 

    public string NormalMethod() 
    { 
     Console.WriteLine("In NormalMethod"); 
     return "normal"; 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     dynamic d = new MyDynamic(); 
     Console.WriteLine(d.HelloWorld()); 
     Console.WriteLine(d.NormalMethod()); 
    } 
} 

<plug>

我的DynamicObject2nd edition of C# in Depth一個更大的例子,但我還沒有實現IDyamicMetaObjectProvider。我會在本書發行之前這樣做,但早期的訪問版本目前只有DynamicObject示例。順便說一句,如果你今天購買它的一半價格 - 使用代碼twtr0711。我將在後面編輯這個答案刪除位:)

</plug>

+0

哇,謝謝喬恩! – 2009-07-10 17:50:17

相關問題