You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#委托对象技术问询:能否基于对象创建委托及如何调用?

关于C#委托与事件的两个问题解答

嘿,作为C#新手碰到这类委托和事件的疑惑太正常了,我来逐个帮你理清:

1. 能否创建基于object而非method的委托?

首先得明确:C#里的委托本质是对方法的引用,所有委托实例都必须关联一个方法——不过这个方法不一定是显式命名的方法,也可以是匿名方法或者Lambda表达式(这两种看起来更像“直接写在代码里的逻辑块”,而非单独定义的方法)。

你给出的代码里已经用到了匿名方法:

bank.Account.NewAcc += delegate (Customer customerInfo) { 
    Console.WriteLine ("Customer Name : " + customerInfo.Name); 
};

这其实就是创建了一个委托实例,绑定到这个匿名方法上。你也可以用更简洁的Lambda表达式改写,效果完全一样:

bank.Account.NewAcc += customerInfo => 
    Console.WriteLine($"Customer Name : {customerInfo.Name}");

不过要注意:不管是匿名方法还是Lambda,底层依然是方法——编译器会帮你把它们编译成隐藏的命名方法,再绑定到委托实例上。所以不存在“完全脱离方法的委托”,但你可以用匿名的方式来定义委托要执行的逻辑,不用单独写一个命名方法。

2. 在无更多API信息的情况下,如何调用该委托?

这里要先区分委托和事件的区别:bank.Account.NewAcc是一个事件,而事件是对委托的封装——外部代码只能订阅(用+=)或取消订阅(用-=)事件,不能直接调用事件背后的委托,只有定义这个事件的类(也就是Account类)内部才能触发它。

如果没有API文档,我们可以从事件的签名反推它的触发方式:

  • 从代码里的匿名方法参数Customer customerInfo可以看出,这个事件对应的委托类型是接受一个Customer对象作为参数,返回值为void的。

如果是在Account类内部,触发这个事件的代码通常是这样的:

// 先判断事件是否有订阅者,避免空引用异常
NewAcc?.Invoke(new Customer { Name = "示例客户" });

但作为外部代码(比如你自己的应用代码),你没办法直接调用这个事件——你能做的只有订阅它,等待Account类内部在合适的时机(比如创建新账户成功时)自动触发这个事件,然后你的订阅逻辑就会执行。

如果非要模拟触发(比如测试场景),你可能需要用反射来获取事件背后的委托字段,然后调用它,但这属于非常规操作,不推荐在生产代码里使用。

内容的提问来源于stack exchange,提问作者Tan Bama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:55:00