[英]C# 4.0: Dynamic, Inheriting from DynamicObject
Let's say I have this: 假设我有这个:
dynamic foo = new Foobar();
And I have this: 我有这个:
public class Foobar : DynamicObject
{
}
The question is, is it possible to override members of DynamicObject
so that this code: 问题是,是否可以覆盖
DynamicObject
成员,以便此代码:
string name = new Foobar().Name
Does not throw an Exception
at run-time? 不在运行时抛出
Exception
? I want to return default
for name
's if Name
is not a member. 如果
Name
不是成员,我想返回name
的default
。
Possible? 可能? What do I need to override?
我需要覆盖什么?
Override TryGetMember (and TrySetMember). 覆盖TryGetMember(和TrySetMember)。 Classes derived from the DynamicObject class can override this method to specify dynamic behavior for operations such as getting a value for a property.
从DynamicObject类派生的类可以重写此方法,以指定操作的动态行为,例如获取属性的值。
http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember.aspx http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember.aspx
You need to override TryGetMember . 您需要覆盖TryGetMember 。 Just set to always return true, and provide the default if the member does not exist.
只需设置为始终返回true,并在成员不存在时提供默认值。
Something like this: 像这样的东西:
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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.