【发布时间】:2014-05-28 06:43:52
【问题描述】:
我有办法
public static class PropertyLensMixins
{
public static ILens<Source> PropertyLens<O,Source>
( this O o
, Expression<Func<O, Source>> selector
)
where O: class, INotifyPropertyChanged
where Source: class, Immutable
{
return new PropertyLens<O, Source>(o, selector);
}
}
这个想法就是这样使用它
this.PropertyLens(p=>p.MyProp)
但是,即使编译器会接受,创建嵌套表达式也是错误的
this.PropertyLens(p=>p.MyProp.NestProp)
现在我可以通过解析表达式树在运行时捕获它。例如
var names = ReactiveUI.Reflection.ExpressionToPropertyNames(selector).ToList();
if (names.Count > 1)
throw new ArgumentException("Selector may only be depth 1", "selector");
但是我想知道,有没有什么聪明的方法可以在编译时检测到这一点?我对此表示怀疑,因为编译器对类型签名很满意,但我想我还是会问。
我也尝试了一个 Resharper 模式来匹配它作为一个错误
$id0$.PropertyLens($id1$=>$id1$.$id2$.$id3$)
所有占位符都是标识符,但 Resharper 似乎无法匹配它。
【问题讨论】:
标签: c# resharper expression-trees