经过一番思考,我很高兴感谢这个问题和一些答案,我解决了我的一个老问题:在泛型 T 上使用操作:
首先是 Cast 的示例(根据 OP 的要求)
public static class Cast<T, U>
{
public static readonly Func<T, U> Do;
static Cast()
{
var par1 = Expression.Parameter(typeof(T));
Do = Expression.Lambda<Func<T, U>>(Expression.Convert(par1, typeof(U)), par1).Compile();
}
}
然后是一个乘法示例:
public static class Multiply<T>
{
public static readonly Func<T, T, T> Do;
static Multiply()
{
var par1 = Expression.Parameter(typeof(T));
var par2 = Expression.Parameter(typeof(T));
Do = Expression.Lambda<Func<T, T, T>>(Expression.Multiply(par1, par2), par1, par2).Compile();
}
}
使用非常简单:
int x = Conv<T, int>.Do(someTValue);
最后创建了一个静态类,其中有一个字段是一个名为的只读静态属性Do
,它是一个“指向”使用表达式树构建的操作的委托。
乘法类似:
T res = Multiply<T, T>.Do(someTValue1, someTValue2);
在一般情况下,乘法比直接乘法慢 3 倍(在发布模式下,没有调试)。
从乘法开始,显然做其他操作很简单
(有趣的是,我对Expression
树非常了解,但我从未想过使用静态类作为包含各种类型的“字典”。我总是做类似的事情,Dictionary<Type, Delegate>
而不是让 .NET “处理”Dictionary
通过泛型类专业化。)