是否可以静态验证c#表达式树参数的结构?

bra*_*ing 5 c# resharper expression-trees

我有一个方法

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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

而这个想法是以这种方式使用它

this.PropertyLens(p=>p.MyProp)
Run Code Online (Sandbox Code Playgroud)

但是,即使编译器接受它,创建嵌套表达式也是错误的

this.PropertyLens(p=>p.MyProp.NestProp)
Run Code Online (Sandbox Code Playgroud)

现在我可以通过解析表达式树在运行时捕获它.例如

var names = ReactiveUI.Reflection.ExpressionToPropertyNames(selector).ToList();
if (names.Count > 1) 
    throw new ArgumentException("Selector may only be depth 1", "selector");
Run Code Online (Sandbox Code Playgroud)

我想知道,有没有聪明的方法在编译时检测到这个?我怀疑它是因为编译器对类型签名感到满意,但我想我可能会问.

我也尝试过一个Resharper模式来匹配它作为一个错误

$id0$.PropertyLens($id1$=>$id1$.$id2$.$id3$)
Run Code Online (Sandbox Code Playgroud)

所有占位符都是标识符,但Resharper似乎无法匹配它.

svi*_*ick 2

没有办法让编译器拒绝这样的代码。

一种可能的替代方案是使用 Roslyn 创建自定义诊断。这样,所有此类错误都会被 VS 标记。尽管对于这样的事情来说可能工作量太大了。