我正在使用 expando 对象,并且正在尝试定义计算属性。
我知道我可以通过执行以下操作来定义一个简单的属性:
dynamic myExpando = new ExpandoObject();
myExpando.TheAnswerToLifeTheUniverseAndEverything= 42;
同样,我也可以定义一个方法:
myExpando.GetTheQuestion = ((Func<string>)(() =>
{
return "How many road must a man walk down before we can call him a man?";
}));
使用标准对象时,我们可以定义计算属性,即定义将返回自定义方法/计算结果的属性。不需要举例。
我需要在我的 expando 上做类似的事情——拥有一个实际上调用“Func”的属性(或其他形式的委托,只要我可以调用自定义方法并具有自定义返回类型,任何事情都会发生)。所以基本上我需要调用第二个示例中的方法,但让它像属性一样工作。
基本上我需要能够使用myExpando.GetTheQuestion而不是myExpando.GetTheQuestion()来调用它,同时保持将自定义委托定义为属性主体的能力。
有没有办法做到这一点?我相信我可以通过使用表达式树来做到这一点,但我承认我有点迷路了。任何人都可以就如何实现这一目标提供一些指导吗?
编辑
做了更多的研究。除非有一些我不知道的非常具体的类/接口/sintax,否则我开始认为上述是不可能的。据我所知,ExpandoObject 类通过定义一些执行后台管道的方法来工作 - TryGetMember、TrySetMember 等。现在,当在动态 objetc 上“访问属性”时,TryGetMember 是被调用的成员。该成员从某种内部字典返回一个值(是的,我知道......这有点简化,但应该给出这个想法)......没有对返回的值类型进行测试。这意味着在我的示例中myExpando.GetTheQuestion将返回原始 Func。
似乎由于 TryGetMember 只是返回一个值,因此没有办法让它“执行”属性代码。为了实现这一点,您需要某种表达式/lambda/func/action 代理项,其值实际上是方法的结果。这似乎是不可能的(除非我错过了什么,否则也没有多大意义——基本上你会有一个设置为“委托”的值,然后作为委托返回值获取???)。我是正确的还是这个或者我错过了什么?