使用DLR,我想做这样的事情:
class MyClass {
int MyProperty { get; set; }
}
在剃刀中,我会做这样的事情。 (InstanceOfMyClass
是一个查看MyClass
)
@InstanceOfMyClass.MyProperty
这将输出MyProperty
的字符串表示。
现在,如果我这样做。
@InstanceOfMyClass.MyMissingProperty
我希望输出“Missing:MyMissingProperty”。我很想捕捉整个表达,就像这样。
@InstanceOfMyClass.MyMissingProperty.MoreMissing
可能输出“Missing:MyMissingProperty.MoreMissing”,但这可能会引起很多DLR。
ExpandoObject
允许我这样做吗?如果没有,我该怎么做才能实现这个目标?
答案 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