我一直在测试VS 2010和C#4.0中的一些新东西,并且一直在推动它看到它的极限,到目前为止我喜欢我看到的东西,但有一点让我略微恼火...
鉴于以下两个简单的类,是否有某种方法(除了直接调用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";
}
}
答案 0 :(得分:2)
我怀疑你需要转换为dynamic
,以便编译器可以将属性访问转换为TryGetMember
类。
编辑:
由于.NET和C#不是完全动态的,也不是总是后期绑定(虚拟成员除外),因此有必要明确说明要进行动态类型操作。中间没有:静态类型的对象var,当编译器在编译时无法找到成员时,它充当动态类型。
答案 1 :(得分:1)
没有任何神奇的属性可以强迫某个类始终被视为dynamic
。但是,如果您的问题特别针对类this
,那么只需添加辅助属性:
private dynamic DynThis { get { return this; } }
并改为使用它。