这可能是一个奇怪的问题。 我有一段代码"我需要"包装"一些功能。 为了更简洁,我正在为字典构建一个包装类,我有一些" pre"和"发布"要做的动作,都在try-catch-finally块中,在中间,我想调用一个函数。
我实际上在做的是暴露所有字典方法(以符合接口IDictionary),我想/需要全部实现它们,每一个都应该"插入"在我的"代码片段中#34;。例如,这是我的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);
}
}
}
所以我真正需要的是每个函数,将调用放在" INVOKE HERE"部分。 有没有一个很好的,正确的方法来做到这一点,没有代码重复? 感谢
答案 0 :(得分:2)
你可以拥有一个本身需要一个功能的功能,并且总是像这样进行预处理和后处理:
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
是不够的。也许您需要一个额外的参数来返回错误。
我已更改它,因此您可以处理操作和功能。