2013-03-01 54 views
1

我正在寫一個類似於WCF接口代理的類,但它有一些專門的,但是樣板代碼。我想提取樣板代碼並使用通用或其他機制將調用包裝到類的內部實例中。使用委託來集中樣板代碼的通用函數?

public interface IMyInterface 
{ 
    long fn1(int param1, int param2); 
} 

public class MyInterfaceProxy : IMyInterface 
{ 
    // generated code 
} 

public class MyClass : IMyInterface 
{ 
    private MyInterfaceProxy _myProxy; // implements IMyInterface 
    public long fn1(int param1, int param2) 
    { 
    long result = null; 
    CallMethod(
       delegate(IMyInterface svc) 
       { 
        result = svc.fn1(param1, param2); 
       }); 
    return result; 
    } 

    private T CallMethod(???) 
    where T : class 
    { 
    T result = null; 

    // some boilerplate code 
    // Call the delegate, passing _myProxy as the IMyInterface to act on 
    // some more boilerplate code 

    return result; 
    } 

}

如果有幫助,樣板代碼可以代表重試邏輯,超時行爲,規範異常處理行爲等

因此,這裏是我的問題:

  1. 有沒有解決這個問題的標準或首選方法?
  2. 如果泛型是首選機制,CallMethod函數的簽名是什麼?
+0

您可以使用基類並使CallMethod成爲基類中的'protected'方法嗎? – 2013-03-01 01:22:52

+0

劃傷我以前的評論,這似乎並不是你所要求的。我不確定我是否按照你的要求提供,但就呼叫簽名而言,你可以使用Func ?看起來像是CallMethod的簽名。有關Func 的更多信息,請參閱[此鏈接](http://msdn.microsoft.com/zh-cn/library/bb549151.aspx)。 – 2013-03-01 01:30:48

回答

2

我想這就是你要找的。還有更多可以完成的功能。這是函數式編程範例的表面劃痕,我們現在可以在c#中使用它,這真的很棒。

編輯:添加了匿名函數實現以及更好地模擬您的委託場景。

class Program 
{ 
    static void Main(string[] args) 
    { 
     string resFromFunctionToBeWRapped = CallMethod(() => FunctionToBeWrapped()); 

     int resFromAnon = CallMethod(() => { 
      Console.WriteLine("in anonymous function"); 
      return 5; 
     }); 

     Console.WriteLine("value is {0}", resFromFunctionToBeWRapped); 
     Console.WriteLine("value from anon is {0}", resFromAnon); 

     Console.ReadLine(); 
    } 

    private static TResult CallMethod<TResult>(Func<TResult> functionToCall) //where T : class 
     { 
     Console.WriteLine ("in wrapper"); 

     var ret = functionToCall(); 

     Console.WriteLine("leaving wrapper"); 

     return ret; 
     } 

    private static string FunctionToBeWrapped() 
    { 
     Console.WriteLine("in func"); 
     return "done"; 
    } 

} 
+0

這非常接近我提出的 - 讓我很高興給你答案的信用!唯一的調整是改變函數功能從函數功能到Func鍵(因爲FunctionToBeWrapped採用單個參數。) 保護ķCallMethod (Func鍵 serviceInvoker) 其中K:類 { ķ結果= NULL; ServiceChannel.UseServiceClient(HostName,EndpointName,delegate(T svc) {result = serviceInvoker.Invoke(svc);}); 返回結果; } – mcating 2013-03-01 03:11:19

+0

此外,我得到的調用代碼看起來像「return CallMethod(svc => svc.fn1(1,2));」 – mcating 2013-03-01 03:13:45