2010-02-25 41 views
3

我一直在努力獲得一個在.NET 3.5中工作的簡單DynamicObject示例。.Net 3.5 DLR DynamicObject幫助

使用DLR關閉CodePlex上我一直無法弄清楚什麼.NET 3.5等同於以下是最新版本:

public class DynamicObjectBag : DynamicObject 
{ 
    private Dictionary<string, object> _properties = new Dictionary<string, object>(); 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     return _properties.TryGetValue(binder.Name, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     _properties[binder.Name] = value; 
     return true; 
    } 
} 

dynamic foo = new DynamicObjectBag(); 
foo.Val1 = 3; 
foo.Val2 = 「Value 2」; 

當然,這是一個簡單的例子。我打算從DynamicObject派生類,以便能夠使用相同的語義點樣式表示法或訪問方法同時使用存儲在字典中的直接對象屬性和屬性。目標是在DLR支持的語言中使用DLR兼容對象,並在將應用程序升級到.NET 4.0時提供與.NET 4.0 DLR功能的未來兼容性。

我的問題是,pre.NET 4.0我沒有與動態關鍵字等效的概念。像TryGetMember這樣的方法有一個像GetMemberBinder這樣的綁定參數。現在.NET 4.0有一個可用的C#默認綁定,它允許綁定在使用動態關鍵字時發生,但是我一直無法找到或確定如何在.NET 3.5中執行相同的操作。

目前,我的理解是,我需要編寫一個自定義綁定器,它基本上會重現.NET 4.0默認C#綁定器中可用的邏輯類型。

請有人指出我如何在.NET 3.5中使用DynamicObject並在運行時添加屬性等,而無需訪問動態關鍵字。

參考文獻:
Dynamically adding members to a dynamic object
http://tomlev2.wordpress.com/2009/10/08/c-4-0-implementing-a-custom-dynamic-object/

回答

2

您將需要創建一個定製綁定,你可能會想,然後使用調用點消耗的粘合劑,使行動被緩存。

你可以在外層使用DefaultBinder來完成大部分的工作 - 你只需要創建一個,然後就可以使用GetMember方法來完成綁定。然後,您的綁定的實現就是使用DefaultBinder並對返回的裝箱值類型應用任何規則(DLR要求所有返回類型都是對象)。

+0

這是我目前的想法很好。我希望有一些祕密忍者移動,我錯過了,所以我不必編寫一個自定義綁定和調用站點給出這種類型的行爲在.NET 4.0中可用。 – Firestrand