是否可以静态地验证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似乎无法匹配它
没有办法让编译器拒绝这样的代码。
一个可能的选择是使用Roslyn创建自定义诊断。这样,所有这样的错误都将被vs标记出来,尽管对于这样的事情来说可能工作量太大了。