C# 4.0:动态特性,继承自DynamicObject

6

假设我有这个:

dynamic foo = new Foobar();

我有这个:

public class Foobar : DynamicObject
{

}

问题是,是否可能覆盖DynamicObject的成员,使得以下代码生效:
string name = new Foobar().Name

在运行时不会抛出异常?如果Name不是成员,我想要返回default的值。

有可能吗?我需要覆盖哪些内容?

3个回答

7

为什么当我像这样从DynamicObject继承时,无法序列化任何属性?我只会得到一个空对象字符串“{}”。 - topwik

3

类似这样:

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

1

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


Foobar 怎么知道默认值的呢? - SnickersAreMyFave
@CantEatPeanutsDoh:你想让它做什么?你可以让它返回任何你想要的内容。如果你想要默认值为“Fred”,只需将该值设置为“Fred”,这样就完成了... - Reed Copsey
1
嗯...这条评论与你的话有矛盾:"如果Name不是成员,我想返回默认值。"如果Foobar不知道默认值,那么谁知道呢?您可以从Foobar.Name属性返回null,并让调用者决定默认名称是什么。 - Sergey Teplyakov
一个继承了dynamicObject的对象是否仍然可以使用json.net正确序列化?如果我执行JsonConverter.SerializeObject(foo),我只会在字符串中得到一个空对象“{}”。 - topwik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接