使用委托来集中样板代码的通用函数

本文关键字:代码 函数 集中 | 更新日期: 2023-09-27 18:01:35

我正在编写一个类似于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函数的签名是什么?

使用委托来集中样板代码的通用函数

我想这就是你要找的。组合函数还有很多可以做的事情。这只是函数式编程范式的皮毛,现在我们可以在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";
    }
}