C# 4.0:动态,继承自 DynamicObject

发布于 2024-09-26 12:43:42 字数 402 浏览 0 评论 0原文

假设我有这个:

dynamic foo = new Foobar();

我有这个:

public class Foobar : DynamicObject
{

}

问题是,是否可以覆盖 DynamicObject 的成员,以便此代码:

string name = new Foobar().Name

在运行时不会抛出 Exception -时间?如果 Name 不是成员,我想返回 namedefault

可能的?我需要覆盖什么?

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:

string name = new Foobar().Name

Does not throw an Exception at run-time? I want to return default for name's if Name is not a member.

Possible? What do I need to override?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凉城凉梦凉人心 2024-10-03 12:43:42

重写 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

Override TryGetMember (and 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.

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx
http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember.aspx

南风起 2024-10-03 12:43:42

像这样的事情:

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;
    }
}

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;
    }
}
写下不归期 2024-10-03 12:43:42

您需要覆盖 TryGetMember。只需设置为始终返回 true,并在成员不存在时提供默认值。

You need to override TryGetMember. Just set to always return true, and provide the default if the member does not exist.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文