2016-01-19 48 views
1

我需要定義的方法,它獲取參數兩個委託,並返回委託(這將乘以paramiters這個委託的返回)。現在我有這樣的,但我不能使它可編譯。你能提供一些建議,還是回答?我將非常感激。方法返回委託,它是來自參數值代表的乘法值

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

你能說出所有委託實例符合Func 簽名? – galenus

+0

@galenus是的,它們都符合Func 簽名。 – Yurrili

回答

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(); 
} 

此外,您可以更換DelegateFunc<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)); 
} 
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) 
     ); 
}