Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在固定代码段中调用函数/从包装器类中公开对象_C#_Oop_Dictionary_Delegates_Wrapper - Fatal编程技术网

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

C# 在固定代码段中调用函数/从包装器类中公开对象,c#,oop,dictionary,delegates,wrapper,C#,Oop,Dictionary,Delegates,Wrapper,这可能是个奇怪的问题。 我有一段“代码”,我需要用它“包装”一些函数。 为了更简洁,我正在为字典构建包装类,并且我有一些“预”和“后”的动作要做,所有在一个尝试catch最后块中,在中间,我想调用一个函数。 我实际做的是公开所有的dictionary方法(以符合接口IDictionary),我希望/需要实现它们,并且每个方法都应该“插入”到我的“代码块”中。例如,这是我的ContainsKey(TKey): 所以我真正需要的是每个函数,将调用放在“INVOKE HERE”部分。 有没有一个好的,

这可能是个奇怪的问题。 我有一段“代码”,我需要用它“包装”一些函数。 为了更简洁,我正在为字典构建包装类,并且我有一些“预”和“后”的动作要做,所有在一个尝试catch最后块中,在中间,我想调用一个函数。 我实际做的是公开所有的dictionary方法(以符合接口IDictionary),我希望/需要实现它们,并且每个方法都应该“插入”到我的“代码块”中。例如,这是我的
ContainsKey(TKey)

所以我真正需要的是每个函数,将调用放在“INVOKE HERE”部分。 有没有一个好的,正确的方法来做到这一点,没有代码重复?
谢谢

您可以拥有一个函数,该函数本身具有一个函数,并且始终执行如下预处理和后处理:

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);
        }
    } 
}
public bool ContainsKey(TKey)
{
布尔结果=假;
WrapFunction(()=>{result=MyDict.ContainsKey(key);});
返回结果;
}
公共空间清除()
{
WrapFunction(()=>MyDict.Clear());
}
私有无效包装函数(操作)
{
bool islocktake=false;
尝试
{
//获取锁:
Monitor.TryEnter(SyncRoot、monitoretertimeout、ref islocktake);
如果(!IsLockTake)
{
日志(@“无法进入监视器”);
返回;
}
动作();
}
catch(System.Exception-ex)
{
日志(String.Format(“错误:{0}”,例如ToString());
返回;
}
最后
{
如果(IsLockTake)
{
Monitor.Exit(SyncRoot);
}
} 
}
不过,您必须检查错误条件处理。显然,对于泛型
T
,返回
false
是不够的。也许您需要一个额外的参数来返回错误


我已经更改了它,以便您可以处理操作和函数。

这是一个很好的解决方案,尽管您不能将其重新用于void方法。知道如何重用代码来填补空白吗?@MotiAzu I添加了一些东西来处理动作和功能。很有创意!您甚至可以创建一个
WrapFunction
,它接受
Func
,使用相同的思想
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);
        }
    } 
}