假设我有这个:
dynamic foo = new Foobar();
我有这个:
public class Foobar : DynamicObject
{
}
问题是,是否可能覆盖
DynamicObject
的成员,使得以下代码生效:string name = new Foobar().Name
在运行时不会抛出异常?如果Name
不是成员,我想要返回default
的值。
有可能吗?我需要覆盖哪些内容?
覆盖TryGetMember(和TrySetMember)。从DynamicObject类派生的类可以重写此方法,以指定诸如获取属性值之类的操作的动态行为。
http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember.aspx
类似这样:
class Foobar : DynamicObject
{
private object m_object;
public ExposedObjectSimple(object obj)
{
m_object = obj;
}
public override bool TryInvokeMember(
InvokeMemberBinder binder, object[] args, out object result)
{
//Trying to find appropriate property
var property = m_object.GetType().GetProperty("Name", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
if (property != null)
{
result = (string)property.GetValue(b, null);
return true;
}
result = SomeDefaultName;
return true;
}
}
你需要重写TryGetMember。只需设置为始终返回true,并在成员不存在时提供默认值。