使用委托来集中样板代码的通用函数
本文关键字:代码 函数 集中 | 更新日期: 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;
}
}
如果有帮助的话,样板代码可以表示重试逻辑、超时行为、标准化异常处理行为等。
我的问题是:
- 是否有一个标准或首选的方法来解决这个问题? 如果泛型是首选机制,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";
}
}