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

标签 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); 
    }
}

想法就是这样使用它

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/

相关文章:

c# - 如何在 EF 查询中使用函数参数化选择器?

c# - 在 IEnumerable 上使用 Observable 集合的优缺点

c# - 如何使用 Microsoft Speech 从语音模式中识别说话者?

visual-studio - Visual Studio 2015 Ctrl + D(代码重复)不起作用(Resharper的键盘快捷方式方案问题)

visual-studio-2008 - 你能同时运行 Resharper 4.5 和 5.0 Beta 吗?

c# - GetCustomAttributes 性能问题(表达式树是解决方案??)

c# - Newtonsoft JSON,检查属性及其值是否存在

c# - 如何管理在运行时创建的 WinForms 按钮的委托(delegate)?

c# - 从 Resharper 撤消 "Folder ' <folderName >' do not introduce namespace"

c# - 在 Select() 查询中使用的 Lambda 表达式