是否可以覆盖'我的委托包装器被调用的方式?所以我可以用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() {...}
   ...
}

我已经设法重载+/-操作符,所以我不必显式地调用AddRemove -但是每当我想调用时,我必须调用Invoke -我想知道是否有一种方法可以像普通委托一样调用它,即

var meAction = new SerializedAction();
meAction += handler;
meAction(); // instead of meAction.Invoke()?

这可能吗?

谢谢。

是否可以覆盖'我的委托包装器被调用的方式?所以我可以用meAction()代替meAction. invoke(

不幸的是,这在c#中是不可能的。"()"语法简单地编译为对Delagate.Invoke()的调用;它不是一个可重写的操作符。由于普通的c#类不能扩展Delegate或MulticastDelegate,因此你不能让编译器允许你在你的类中使用()语法。也就是说,通过创建扩展MulticastDelegate的类型并将其编译为一个单独的程序集,然后从c#代码中引用,可能有可能对原始IL做类似的事情。