【问题标题】:Is it possible to statically verify structure of c# expression tree arguments?是否可以静态验证 c# 表达式树参数的结构?
【发布时间】:2014-05-28 06:43:52
【问题描述】:

我有办法

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# resharper expression-trees


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 2019-08-03
      • 2012-12-24
      相关资源
      最近更新 更多