如何添加具有参数值且没有 lambda 表达式的委托
How to add a delegate with parameter values and without lambda expression
我正在尝试寻找一种方法来添加具有参数值但没有 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;
}
在更复杂的情况下,订阅操作发生在与取消订阅不同的地方,您需要将对处理程序的引用存储在一个字段中。
我正在尝试寻找一种方法来添加具有参数值但没有 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;
}
在更复杂的情况下,订阅操作发生在与取消订阅不同的地方,您需要将对处理程序的引用存储在一个字段中。