在固定代码段中调用函数/从包装类公开对象
本文关键字:包装类 对象 函数 代码 段中 调用 | 更新日期: 2023-09-27 18:31:48
这可能是一个奇怪的问题。我有一段"代码",我需要用它"包装"一些函数。为了更简洁,我正在为字典构建一个包装类,并且我有一些"pre"和"post"操作要做,所有这些都在一个try-catch-final块中,在中间,我想调用一个函数。
我实际上正在做的是公开所有字典方法(以符合接口 IDictionary),我希望/需要实现它们,并且每个方法都应该"插入"到我的"代码段"中。例如,这是我的ContainsKey(TKey key)
:
public bool ContainsKey(TKey key)
{
bool IsLockTaken = false;
try
{
// Acquire the lock:
Monitor.TryEnter(SyncRoot, MonitorEnterTimeout, ref IsLockTaken);
if (!IsLockTaken)
{
Log(@"Failed to Enter a monitor.");
return false;
}
/* INVOKE HERE */
return MyDict.ContainsKey(key);
}
catch (System.Exception ex)
{
Log(String.Format("Error: {0}", ex.ToString()));
return false;
}
finally
{
if (IsLockTaken)
{
Monitor.Exit(SyncRoot);
}
}
}
所以我真正需要的是每个函数,将调用放在"调用这里"部分。有没有一种很好的、正确的方法来做到这一点,没有代码重复?谢谢
你可以有一个函数,它本身接受一个函数,并且总是像这样进行预处理和后处理:
public bool ContainsKey(TKey key)
{
bool result = false;
WrapFunction(() => { result = MyDict.ContainsKey(key); });
return result;
}
public void Clear()
{
WrapFunction(() => MyDict.Clear());
}
private void WrapFunction(Action<T> action)
{
bool IsLockTaken = false;
try
{
// Acquire the lock:
Monitor.TryEnter(SyncRoot, MonitorEnterTimeout, ref IsLockTaken);
if (!IsLockTaken)
{
Log(@"Failed to Enter a monitor.");
return;
}
action();
}
catch (System.Exception ex)
{
Log(String.Format("Error: {0}", ex.ToString()));
return;
}
finally
{
if (IsLockTaken)
{
Monitor.Exit(SyncRoot);
}
}
}
不过,您必须检查错误条件处理。显然,使用通用T
,返回false
是不够的。也许您需要一个额外的参数才能在出错时返回。
我已经更改了它,以便您可以处理操作和功能。