C# 如何添加带有参数值且不带lambda表达式的委托

C# 如何添加带有参数值且不带lambda表达式的委托,c#,events,architecture,delegates,C#,Events,Architecture,Delegates,我试图找到一种方法来添加带有参数值但没有lambda表达式的委托。我找不到一个架构可以让它适合我的需要。请看以下示例: public class MyDelegateClass { public class ArgsHolder : EventArgs { public object[] data; public ArgsHolder(params object[] data) { this.data = data; } } pu

我试图找到一种方法来添加带有参数值但没有lambda表达式的委托。我找不到一个架构可以让它适合我的需要。请看以下示例:

public class MyDelegateClass
{
  public class ArgsHolder : EventArgs
  {
    public object[] data;
    public ArgsHolder(params object[] data)
    {
        this.data = data;
    }
  }

  public event EventHandler handler;
  public void Execute()
  {
        ArgsHolder holder = new ArgsHolder(5, 3); // this is the problem
        handler?.Invoke(this, holder);
  }
}

public class OutsideClass
{ 
  public void Start()
  {
    MyDelegateClass del = new MyDelegateClass();
    del.handler += new EventHandler(EventMethod);
    del.Execute();
    del.handler -= new EventHandler(EventMethod);
  }

  private void EventMethod(object sender, EventArgs args)
  {
    ArgsHolder holder = (ArgsHolder)args;
    print(args.data[0] + " " + args.data[1]
  }
}
问题是,MyDelegateClass设置了值,这可以通过以下lambda表达式避免:

public class OutsideClass
{ 
  public void Start()
  {
    MyDelegateClass del = new MyDelegateClass();
    ArgsHolder holder = new ArgsHolder(5,3);
    del.handler += (sender,args) => EventMethod(this, holder);
    del.Execute();
    del.handler -= (sender,args) => EventMethod(this, holder); // this is now the problem
  }

  private void EventMethod(object sender, EventArgs args)
  {
    ArgsHolder holder = (ArgsHolder)args;
    print(args.data[0] + " " + args.data[1]
  }
}

这会起作用,但现在我无法删除必要的事件,因为订阅服务器对象在我的项目中是动态的。我希望我在阐述手头的问题时足够精确:)

删除订阅处理程序是基于引用比较的,因此只要从lambda表达式创建一个委托并存储它,就可以删除它:

public void Start()
{
  MyDelegateClass del = new MyDelegateClass();
  ArgsHolder holder = new ArgsHolder(5,3);
  
  EventHandler eventHandler = (sender,args) => EventMethod(this, holder);

  del.handler += eventHandler;
  del.Execute();
  del.handler -= eventHandler;
}

在一个更复杂的场景中,订阅操作发生在与取消订阅不同的位置,您需要将对处理程序的引用存储在一个字段中。

只需将委托保存到变量,然后sub/unsub。如果不清楚eocron写了什么,
EventHandler ea=(发送方,args)=>EventMethod(这个,持有者);del.handler+=ea;del.Execute();del.handler-=ea