动态属性评估

时间:2011-12-29 18:05:00

标签: c# c#-4.0 razor dynamic-language-runtime

使用DLR,我想做这样的事情:

class MyClass {
   int MyProperty { get; set; }
}

在剃刀中,我会做这样的事情。 (InstanceOfMyClass是一个查看MyClass

实例的动态对象
@InstanceOfMyClass.MyProperty

这将输出MyProperty的字符串表示。

现在,如果我这样做。

@InstanceOfMyClass.MyMissingProperty

我希望输出“Missing:MyMissingProperty”。我很想捕捉整个表达,就像这样。

@InstanceOfMyClass.MyMissingProperty.MoreMissing

可能输出“Missing:MyMissingProperty.MoreMissing”,但这可能会引起很多DLR。

ExpandoObject允许我这样做吗?如果没有,我该怎么做才能实现这个目标?

3 个答案:

答案 0 :(得分:3)

以这种方式扩展DynamicObject.TryGetMember:

如果该成员存在,则返回该值。如果该成员不存在,则返回一个类的新实例,该实例将处理缺少的属性的字符串表示形式以及链。像这样的东西

public class MissingPropertyChain : DynamicObject
{
    private string property;

    public MissingPropertyChain(string property)
    {
        this.property = property;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    {
        if(binder.Name == "ToString")
            result = "Missing property: " + property;
        else
            result = new MissingPropertyChain( property + "." + binder.Name;

        return true;
    }
}

我没有尝试过,但我认为它会让你知道如何解决这个问题。

希望它有所帮助。

答案 1 :(得分:0)

我不确定Expando,当您想要设置属性然后获取它时,它会被使用。但是,从您所写的内容来看,您似乎希望能够读取之前未设置的任何值。

为此,可以使用DynamicObject。您只需覆盖TryGetMember

答案 2 :(得分:0)

您可以通过创建自己的DynamicObject版本然后覆盖TryGetMember

来实现

http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx