【发布时间】:2021-05-26 18:15:52
【问题描述】:
所以我在 C# 中重构了一个库,它基本上是一些 DLL 的包装器。包装器中有很多函数都共享相同的复制粘贴样板代码。下面是一个示例,它是 C#,其中 arguments 是例如伪代码。 int arg1, bool arg2 等。
public ReturnType foo(arguments)
{
if (!isOpen)
{
return ReturnType.RESULT_NOT_OPEN;
}
if (!Monitor.TryEnter(mutex, mutexTimeout))
{
return ReturnType.RESULT_LOCK_TIMEOUT;
}
ReturnType result;
try { result = SomeFunctionFromDll(handle, arguments); }
finally { Monitor.Exit(mutex); }
return result;
}
DLL 函数具有不同类型的参数,但具有与 C# 包装器相同的签名,除了句柄参数。摆脱所有这些样板文件真是太好了。梦境会是这样的
private ReturnType AllCommonBoilerPlate(arguments, dll_function_reference)
{
// Do mutex, error check etc
dll_function_reference(handle, arguments);
}
public ReturnType foo(arguments)
return AllCommonBoilerPlate(arguments, SomeFunctionFromDll);
这个概念在 C# 中可行吗?我尝试过使用委托函数,但找不到解决方案。
我发现我可以将所有初始检查(如 isOpen)并尝试在单独的函数中获取互斥锁,但这并没有太大帮助。另外,这会使互斥体有点模糊。
【问题讨论】: