如何在字典中使用某种类型的表达式>作为关键字?使用表达式<Func<object>>作为字典中的关键字
我刚开始玩表达式实例,不知道我想做什么是可能的。
看起来2个相同的表达式与我尝试时不相同我可以使用表达式作为键将条目放入字典中,但当我询问字典是否包含键时,它将返回false,除非我使用非常相同的表情实例。
TypeToTest test = new TypeToTest();
Expression<Func<object>> expression =()=>test.PropertyA;
IDictionary<Expression<Func<object>>,bool> dictionary = new Dictionary<Expression<Func<object>>, bool>();
dictionary[expression] = true;
Assert.That (dictionary.ContainsKey(expression), Is.True);
Assert.That (dictionary.ContainsKey(()=>test.PropertyA), Is.True);
上面的最后一行失败,当我希望它成功。
意图是有能力定义一组适用于对象的属性或方法的规则,以便我可以确定(例如)某个属性是可编辑的还是具有字典中特定键的值可以删除。我不希望在对象上有一个标志确定它是否可编辑(因为可编辑性对于不同的属性可能不同),另一个标志确定它是否可删除,而是另一个负责维护关联规则的类与对象一起使用,以便在未来扩展对象时,可以添加更多规则来描述对象组成部分的可编辑性/可访问性/可删除性/。如果这是有道理的。
有类似的帖子here,但这似乎是基于属性名称的关键,因为我希望能够键入方法和参数,所以我可以支持确定持有对象的可编辑性在基于密钥的字典中。
会这样的事情是可能的还是它在天空中馅饼?
你为什么认为它不是一个很好的选择?它似乎允许每个属性/方法单独控制其可访问性,如果类型被扩展(可以使用另一个接口) – 2010-12-13 11:43:09
@Sam - 因为没有明确定义的相等性检查,所以可以轻松地扩充该类型。例如;是'x => x.A'与'y => y.A'有相同的表达式吗?如果表达式捕获一个捕获变量包装的对象实例会怎么样? – 2010-12-13 11:44:10
很好的解决方案。 – IamStalker 2014-04-22 12:09:00