在固定的代码片段中调用函数/从包装器类中公开对象

时间:2014-11-25 12:48:34

标签: c# oop dictionary delegates wrapper

这可能是一个奇怪的问题。 我有一段代码"我需要"包装"一些功能。 为了更简洁,我正在为字典构建一个包装类,我有一些" 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"部分。 有没有一个很好的,正确的方法来做到这一点,没有代码重复? 感谢

1 个答案:

答案 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是不够的。也许您需要一个额外的参数来返回错误。

我已更改它,因此您可以处理操作和功能。