[英]Is it possible to statically verify structure of c# expression tree arguments?
我有一個方法
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標記。 雖然這樣的事情可能太多了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.