首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态属性评估

动态属性评估
EN

Stack Overflow用户
提问于 2011-12-30 02:05:00
回答 3查看 429关注 0票数 4

对于DLR,我想做这样的事情:

代码语言:javascript
复制
class MyClass {
   int MyProperty { get; set; }
}

在剃刀中,我会做这样的事情。(InstanceOfMyClass是查看MyClass实例的某个动态对象)

代码语言:javascript
复制
@InstanceOfMyClass.MyProperty

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

现在如果我这样做。

代码语言:javascript
复制
@InstanceOfMyClass.MyMissingProperty

我希望它输出"Missing: MyMissingProperty“。我很乐意捕捉整个表达式,如下所示。

代码语言:javascript
复制
@InstanceOfMyClass.MyMissingProperty.MoreMissing

可能会输出"Missing: MyMissingProperty.MoreMissing",但这可能会对DLR要求很高。

ExpandoObject会允许我这样做吗?如果不是,我要怎么做才能实现它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-30 02:18:48

这样扩展DynamicObject.TryGetMember:

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

代码语言:javascript
复制
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;
    }
}

我没有试过,但我想它会给你解决这个问题的想法。

希望能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2011-12-30 02:09:09

我不太确定Expando,当你想要设置属性然后获取它时,它是相当有用的。但是,从您编写的内容来看,您似乎希望能够读取以前未设置的任何值。

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

票数 0
EN

Stack Overflow用户

发布于 2011-12-30 02:14:17

您可以通过创建自己的DynamicObject版本然后覆盖TryGetMember来实现这一点

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8671525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档