C# 是否将方法作为参数传递,并为传入的方法传递零个或多个参数?

C# 是否将方法作为参数传递,并为传入的方法传递零个或多个参数?,c#,triggers,C#,Triggers,我正在尝试编写我称之为“触发器”的代码。它们采用一个对象、一个函数和某种激活标准。一旦激活,它将在该对象上运行该方法 目前它的工作情况与预期一致。一个示例用法是: SomeObject myObj = new SomeObject(); MyTrigger trigger = new MyTrigger(myObj, "Delete"); trigger.Activate(); // calls myObj.Delete(); 现在我用null调用Invoke的地方是参数通常可以使用的地方(我

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

目前它的工作情况与预期一致。一个示例用法是:

SomeObject myObj = new SomeObject();
MyTrigger trigger = new MyTrigger(myObj, "Delete");
trigger.Activate(); // calls myObj.Delete();
现在我用
null
调用
Invoke
的地方是参数通常可以使用的地方(我想)。我遇到的问题是将“零个或多个参数”作为函数声明中的单个参数。在创建
MyTrigger
时,我需要一个第三个参数,它将是
调用期间要传递的参数


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

您必须使用委托

// 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();
//像这样重写触发器构造函数
类MyTrigger
{
公共MyTrigger(目标、行动);
公开作废激活()
{
本行动(本目标);
}
}
//现在,可以使用参数或不使用参数来调用它
SomeObject myObj=新的SomeObject();
var trigger=newmytrigger(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());
静态类MyTrigger
{
公共MyTrigger创建(目标、操作)
{
返回新的MyTrigger(目标、操作);
}
}
//现在像这样编写初始化代码(不再需要指定类型参数):
var trigger=MyTrigger.Create(myObj,o=>o.Delete());

您必须使用代理

// 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();
//像这样重写触发器构造函数
类MyTrigger
{
公共MyTrigger(目标、行动);
公开作废激活()
{
本行动(本目标);
}
}
//现在,可以使用参数或不使用参数来调用它
SomeObject myObj=新的SomeObject();
var trigger=newmytrigger(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());
静态类MyTrigger
{
公共MyTrigger创建(目标、操作)
{
返回新的MyTrigger(目标、操作);
}
}
//现在像这样编写初始化代码(不再需要指定类型参数):
var trigger=MyTrigger.Create(myObj,o=>o.Delete());
您可以使用关键字:

但我更喜欢它,因为它还可以为您提供编译时安全性(而且很可能
触发器
类将大大简化,并抛弃您可能在其中的任何反射。)

您可以使用关键字:


但我更喜欢它,因为它还可以为您提供编译时安全性(而且很可能
Trigger
类将被大大简化,并抛弃您可能在其中的任何反射。)

委托是我以前从未使用过的东西。什么是
t目标
,只是说
这将是一种类型
?那么
Action
表示可以在类型
TTarget
上找到的方法?我想我唯一无法解释的部分是
o=>o.Delete(1234)
o=>o.Delete(1234)
意味着传递的是一个匿名方法,该方法将对传递给它的任何对象调用
.Delete()
,并带有参数
1234
。查看编辑后的答案。@Matthewmgovern查找并创建(o=>o.Delete(1234);)
与编写
void MyMethod(o){o.Delete(1234);}
Create(this.MyMethod)相同
@MatthewMcGovern是的,您只需更新匹配的类型(即
Action Action
),当然还需要调用方法:
{o.Method1();x.Method2();}
(您省略了括号,但我猜这只是一个输入错误)委托是我以前没有使用过的。什么是
t目标
,只是说
这将是一种类型
?那么
Action
表示可以在类型
TTarget
上找到的方法?我想我唯一无法解释的部分是
o=>o.Delete(1234)
o=>o.Delete(1234)
意味着传递的是一个匿名方法,该方法将对传递给它的任何对象调用
.Delete()
,并带有参数
1234
。查看编辑后的答案。@Matthewmgovern查找并创建(o=>o.Delete(1234);)与编写
void MyMethod(o){o.Delete(1234);}
Create(this.MyMethod)相同
@MatthewMcGovern是的,您只需更新匹配的类型(即
Action Action
),当然还需要调用方法:
{o.Method1();x.Method2();}
(您省略了括号,但我猜这只是一个打字错误)