简体   繁体   English

C#4.0:动态,继承自DynamicObject

[英]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不是成员,我想返回namedefault

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM