1

我正在尝试编写我称之为“触发器”的代码。它们采用一个对象、一个函数和某种激活标准。一旦激活,它就会在该对象上运行该方法。

这是一个基本的精简示例。它现在按预期工作。一个示例用法是:

SomeObject myObj = new SomeObject();
MyTrigger trigger = new MyTrigger(myObj, "Delete");
trigger.Activate(); // calls myObj.Delete();

现在我调用Invokenull地方是参数通常可以去的地方(我认为)。我遇到的问题是将“零个或多个参数”作为函数声明中的单个参数。创建时我需要一个第三个参数,MyTrigger这将是在Invoke.

还是有更好的方法来做到这一点?即我可以以某种方式将对象、函数调用和参数作为单个参数传递吗?也许两个参数?

4

2 回答 2

4

你必须使用代表。

// rewrite your trigger constructor like this
class MyTrigger<TTarget>
{
    public MyTrigger(TTarget target, Action<TTarget> action);
    public void Activate()
    {
        this._action(this._target);
    }
}

// now call it with or without parameters
SomeObject myObj = new SomeObject();
var trigger = new MyTrigger<SomeObject>(myObj, o => o.Delete(1234));
trigger.Activate();

您还可以创建一个静态帮助器类,以使创建代码编写起来稍微简单一些:

static class MyTrigger
{
    public MyTrigger<TTarget> Create<TTarget>(TTarget target, Action<TTarget> action)
    {
        return new MyTrigger<TTarget>(target, action);
    }
}

// now write the initialization code like this (you don't have to specify the type parameter anymore):
var trigger = MyTrigger.Create(myObj, o => o.Delete());
于 2013-05-14T14:41:35.353 回答
2

您可以使用params关键字:

public Trigger(object targetObject, string methodName, params object[] parameters)
{
    //"parameters" here will be an array of length 0 if no parameters were passed    
}

MyTrigger trigger = new MyTrigger(myObj, "Delete"); //no parameters
MyTrigger trigger = new MyTrigger(myObj, "Delete", param1); //one parameter
MyTrigger trigger = new MyTrigger(myObj, "Delete", param1, param2); //two parameters

但我更喜欢Knagis 的回答,因为它还会为您提供编译时安全性(并且Trigger该类可能会被大大简化并放弃您可能在其中进行的任何反射。)

于 2013-05-14T14:43:18.983 回答