将方法作为参数传递给传入方法的零个或多个参数?

时间:2013-05-14 14:38:03

标签: c# triggers

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

Here's a basic stripped down example.它现在按预期工作。一个示例用法是:

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

现在我用Invoke调用null的地方通常是参数(我认为)。我遇到的问题是在函数声明中将'零或多个参数'作为单个参数。创建MyTrigger时我需要一个thrid参数,这是Invoke期间传递的参数。

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

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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' answer,因为它也会为您提供编译时的安全性(并且Trigger类可能会简化并且放弃您可能拥有的任何反射在那里。)

相关问题