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