[英]Roslyn fluent syntax to create expression tree for multiline lambda
我正在編寫一個基於Roslyn的自定義工具,它試圖通過在構建時將給定的多行lambda重寫為Expression樹來消除CS0834 。
編輯 :目前,我只針對匿名多行lambdas。
例如:
// Will produce CS0834 if Bar takes Expression<Action<...>>
Foo.Bar((int x) => { ... });
至
Foo.Bar(Expression.Lambda<Action<int>>(
Expression.Block(
...
),
Expression.Parameter(typeof(int))));
這樣就可以正確編譯了。 雖然我可以找出轉換給定代碼所需的Expression。(blah)語法,但使用Roslyn完成它是另一回事。 也許我只是不知道Roslyn Syntax。(blah)API足以翻譯這個原始的lambda
(int index, float[] a, float[] b) =>
{
var sum = 0f;
for (int i = 0; i < index; i++)
sum += a[i];
b[index] = sum;
});
有人可以幫我寫Roslyn Syntax。(blah)語法,它會生成一個類似下面的表達式樹嗎?
Expression<Action<int, float[], float[]>> action =
Expression.Lambda(
Expression.Block(
Expression.Assign(sumParameter, Expression.Constant(0)),
Expression.Loop(...) // The for loop here
)
);
一旦我有了一個起點 - 我應該能夠弄清楚或者至少開始翻譯這個項目中的簡單案例。
非常感謝,非常感謝您的幫助。
我們有一個名為Quoter的工具,它將為任何C#程序生成語法。* API調用 。
您可以在roslynquoter.azurewebsites.net上查看 。
如果你弄清楚生成Expression。*調用的邏輯,你可以輕松生成生成它的代碼。
更新:該工具現在是開源的! https://github.com/KirillOsenkov/RoslynQuoter
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.