我需要定义方法,它将参数作为参数获得两个委托,并返回委托(这将从参数中多次返回此委托)。现在我有这样的,但我不能使它成为可编译的。你能给出一些建议或回答吗?我将非常感激。
public Delegate MathP(Delegate mydelegate, Delegate mydelegate2)
{
return (Delegate) Delegate.CreateDelegate Delegate (int x, int y) {
int results = (int)mydelegate.DynamicInvoke(x, y);
int results2 = (int)mydelegate2.DynamicInvoke(x, y);
return results* results2;
};
}
答案 0 :(得分:3)
如果您可以将代表重写为Func
,则可以轻松完成:
public Func<int, int, int> MathP
( Func<int, int, int> mydelegate
, Func<int, int, int> mydelegate2
)
{
return new Func<int, int, int>
( (x, y) => mydelegate(x, y) * mydelegate2(x, y)
);
}
答案 1 :(得分:2)
您最好使用表达式树。 此方法将产生您期望的结果:
static Delegate Combine(Delegate first, Delegate second)
{
var firstParam = Expression.Parameter(typeof(int));
var secondParam = Expression.Parameter(typeof(int));
var expression = Expression.Lambda<Func<int, int, int>>(
Expression.Multiply(
Expression.Call(first.GetMethodInfo(), firstParam, secondParam),
Expression.Call(second.GetMethodInfo(), firstParam, secondParam)),
firstParam,
secondParam);
return expression.Compile();
}
此外,您可以在方法签名中将Delegate
替换为Func<int,int,int>
,以便更快地调用结果并调用Combine
方法本身 - 类型安全。
请记住,以这种方式获得的代理最好是缓存,否则编译lambda的开销将是很大的。
另一种方法,简单且效率较低的方法是:
static Delegate CombineSimple(Delegate first, Delegate second)
{
return new Func<int, int, int>(
(firstParam, secondParam) =>
(int)first.DynamicInvoke(firstParam, secondParam) *
(int)second.DynamicInvoke(firstParam, secondParam));
}