gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:38:49 24 4
gpt4 key购买 nike

我有一个方法

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com