是否可以覆盖'我的委托包装器被调用的方式?所以我可以用meAction()代替meAction. invoke(
本文关键字:meAction 方式 我可以 invoke 调用 代替 覆盖 我的 包装 是否 | 更新日期: 2023-09-27 17:50:21
我有一个名为SerializedAction
的委托包装
[Serializable]
public class SerializedAction
{
private Action action;
public void Add (Action handler) {...}
public void Remove (Action handler) {...}
public void Invoke () { Get().Invoke(); }
public static SerializedAction operator +(SerializedAction action, Action handler) {...}
public static SerializedAction operator -(SerializedAction action, Action handler) {...}
private RebuildInvocationList() {...}
private Action Get() {...}
...
}
我已经设法重载+/-操作符,所以我不必显式地调用Add
和Remove
-但是每当我想调用时,我必须调用Invoke
-我想知道是否有一种方法可以像普通委托一样调用它,即
var meAction = new SerializedAction();
meAction += handler;
meAction(); // instead of meAction.Invoke()?
这可能吗?
谢谢。
不幸的是,这在c#中是不可能的。"()"语法简单地编译为对Delagate.Invoke()的调用;它不是一个可重写的操作符。由于普通的c#类不能扩展Delegate或MulticastDelegate,因此你不能让编译器允许你在你的类中使用()语法。也就是说,通过创建扩展MulticastDelegate
的类型并将其编译为一个单独的程序集,然后从c#代码中引用,可能有可能对原始IL做类似的事情。