我有一个方法
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 似乎无法匹配它。
最佳答案
没有办法让编译器拒绝这样的代码。
一种可能的替代方法是使用 Roslyn 创建自定义诊断。这样,所有此类错误都会被 VS 标记出来。虽然对于这样的事情来说可能工作量太大了。
关于c# - 是否可以静态验证 c# 表达式树参数的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23904490/