簡體   English   中英

是否可以靜態驗證c#表達式樹參數的結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM