对于DLR,我想做这样的事情:
class MyClass {
int MyProperty { get; set; }
}在剃刀中,我会做这样的事情。(InstanceOfMyClass是查看MyClass实例的某个动态对象)
@InstanceOfMyClass.MyProperty这将输出MyProperty的字符串表示。
现在如果我这样做。
@InstanceOfMyClass.MyMissingProperty我希望它输出"Missing: MyMissingProperty“。我很乐意捕捉整个表达式,如下所示。
@InstanceOfMyClass.MyMissingProperty.MoreMissing可能会输出"Missing: MyMissingProperty.MoreMissing",但这可能会对DLR要求很高。
ExpandoObject会允许我这样做吗?如果不是,我要怎么做才能实现它?
发布于 2011-12-30 02:18:48
这样扩展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;
}
}我没有试过,但我想它会给你解决这个问题的想法。
希望能有所帮助。
发布于 2011-12-30 02:09:09
我不太确定Expando,当你想要设置属性然后获取它时,它是相当有用的。但是,从您编写的内容来看,您似乎希望能够读取以前未设置的任何值。
为此,可以使用DynamicObject。您只需覆盖TryGetMember即可。
发布于 2011-12-30 02:14:17
您可以通过创建自己的DynamicObject版本然后覆盖TryGetMember来实现这一点
http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx
https://stackoverflow.com/questions/8671525
复制相似问题