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

本文关键字:参数 结构 表达式 静态 验证 是否 | 更新日期: 2023-09-27 18:05:34

我有一个方法

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#表达式树参数的结构?

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

一个可能的选择是使用Roslyn创建自定义诊断。这样,所有这样的错误都将被vs标记出来,尽管对于这样的事情来说可能工作量太大了。