我正在尝试编写我称之为“触发器”的内容。它们采用对象,函数和某种激活标准。激活后,它会在该对象上运行该方法。
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
期间传递的参数。
还是有更好的方法吗?即我可以以某种方式将对象,函数调用和参数作为单个参数传递?也许有两个参数?
答案 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
类可能会远简化并且放弃您可能拥有的任何反射在那里。)