重播功能和参数列表

pro*_*ach 8 c# reflection delegates function

我有一系列功能,我想拥有以下功能.

  • 调用该函数时,将其自身添加到记住参数和值的函数列表中
  • 允许在以后调用函数列表

不同的功能有各种不同的参数,我很难想到一个优雅的方法来做到这一点.任何帮助,将不胜感激.

Bro*_*ook 9

我认为这可以满足您的需求,但功能并非"自我添加".

public class Recorder
{
    private IList<Action> _recording;
    public Recorder()
    {
        _recording = new List<Action>();
    }
    public void CallAndRecord(Action action)
    {
        _recording.Add(action);
        action();
    }
    public void Playback()
    {
        foreach(var action in _recording)
        {
            action();
        }
    }
}

//usage
var recorder = new Recorder();
//calls the functions the first time, and records the order, function, and args
recorder.CallAndRecord(()=>Foo(1,2,4));
recorder.CallAndRecord(()=>Bar(6));
recorder.CallAndRecord(()=>Foo2("hello"));
recorder.CallAndRecord(()=>Bar2(0,11,true));
//plays everything back
recorder.Playback();
Run Code Online (Sandbox Code Playgroud)

使函数"自我添加"的一种方法是使用诸如postharp或linfu动态代理之类的AOP库,并添加一个拦截器,它将函数和args添加到数组中.要做到这一点可能会比IMO值得做更多的工作,因为上述更简单并且仍然实现了所需的功能.


Tom*_*ski 5

对此没有一个优雅的解决方案.既然你说这些方法都有不同的签名,就没有办法将它们作为委托存储在一个数组.有了这个,接下来你可以尝试使用反射,将每个参数值存储在object []中,将方法存储为MethodInfo,然后调用它.

编辑:这是我能想到的:

    private Dictionary<MethodBase, object[]> methodCollection = new Dictionary<MethodBase, object[]>();

    public void AddMethod(MethodBase method, params object[] arguments)
    {
        methodCollection.Add(method, arguments);
    }

    private void MyMethod(int p1, string p2, bool p3)
    {
        AddMethod(System.Reflection.MethodInfo.GetCurrentMethod(), new object[] { p1, p2, p3 });
    }

    private void MyOtherMethod()
    {
        AddMethod(System.Reflection.MethodInfo.GetCurrentMethod(), new object[] { });
    }
Run Code Online (Sandbox Code Playgroud)

然后只需调用 method.Invoke(method.ReflectedType, args)