我一直在測試VS 2010和C#4.0中的一些新東西,並且一直在推動一些事情來看它的侷限性,到目前爲止,我喜歡我所看到的,但有一件事讓我略微惱火...在C#4.0中繼承DynamicObject?
鑑於以下兩個簡單的類,是否有某種方法(除了直接調用TryGetMember
)避免投射到dynamic
?也許可以在Test
上設置一些魔法屬性?
class DynamicPropertyObject : DynamicObject
{
private Dictionary<string, object> _properties = new Dictionary<string, object>();
public override IEnumerable<string> GetDynamicMemberNames()
{
foreach (string s in _properties.Keys)
yield return s;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_properties[binder.Name] = value;
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = null;
if (!_properties.ContainsKey(binder.Name))
return false;
result = _properties[binder.Name];
return true;
}
}
class Test : DynamicPropertyObject
{
public Test()
{
((dynamic)this).Foo = "test";
}
}
是啊,你確實......想知道是否有某種方法可以告訴編譯器,這個類應該被動態地處理,因爲它顯然不是「聰明的」(我確信有足夠的理由)足以認識到DynamicObject的子類可以被視爲任何地方的動態。 – 2009-08-27 16:07:25
爲什麼類子類'DynamicObject'應該突然被區別對待,沒有什麼具體原因。首先,任何階級都可以被視爲「動態的任何地方」。另一方面,將類視爲動態更改會調用語義,而且您的類可能會有一些(非動態)成員,這可能會有所不同。因此規則很簡單,並且總是需要「動態」。 – 2009-08-27 16:18:25
類型爲DynamicObject(或派生類)的變量是靜態類型的變量 - 因此不能動態處理。 – 2009-08-27 16:22:17