簡體   English   中英

給定兩個通用類型變量,如何編譯system.linq.expression樹以將它們相乘?

[英]Given two generic type variables, how do I compile a system.linq.expression tree to multiply them?

給定兩個通用類型變量,如何編譯system.linq.expression樹以將它們相乘? 如果兩種類型之間沒有有效的運算符*,則表達式拋出異常是完全可以接受的。

我之所以選擇System.Linq.Expression,是因為我記得在這里看到過這種方式,但是還不夠。

謝謝。

編輯:我選擇編譯一個Linq表達式以提高速度; 這應該盡可能地快。

您可以通過編寫以下代碼來了解如何執行此操作:

Expression<Func<int, int, int>> multiply = 
    (left, right) => left * right;

將其編譯為一個程序集,並使用IL反匯編程序(例如Reflector)查看C#編譯器生成的代碼。

對於給定的示例,C#編譯器將生成如下內容:

var left = Expression.Parameter(typeof(int), "left");
var right = Expression.Parameter(typeof(int), "right");

var multiply = Expression.Lambda<Func<int, int, int>>(
    Expression.Multiply(left, right),
    new ParameterExpression[] { left, right });

這正是指定乘法表達式所需的操作。

當放置在通用方法中時,它可能看起來像這樣:

public static Func<T, T, T> BuildMultiplier<T>()
{
    var left = Expression.Parameter(typeof(T), "left");
    var right = Expression.Parameter(typeof(T), "right");

    var multiply = Expression.Lambda<Func<T, T, T>>(
        Expression.Multiply(left, right),
        new ParameterExpression[] { left, right });

    return multiply.Compile();
}

嘗試這樣的事情:

var left = Expression.Parameter(typeof(T), "left");
var right = Expression.Parameter(typeof(T), "right");
var body = Expression.Multiply(left, right);
return Expression.Lambda<Func<T, T, TResult>>(body, left, right);

如果類型T沒有有效的乘法運算符,則Expression.Multiply行將引發異常。

我選擇了System.Linq.Expression

只是要清楚:還有另一種簡單的方法:

public static T Multiply<T>(T x, T y) {
    return ((dynamic)x) * y;
}

並將工作(包括緩存)卸載到框架。 另一種選擇- MiscUtil具有普通運營商的支持 ,它包裝這件事-下載這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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