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

C#技术问询:如何将自定义委托绑定至非静态方法

绑定自定义委托到非静态方法的分步指南

没问题,我来一步步教你搞定这个委托绑定的事儿~首先得补个小漏洞:你写的Invitation()方法声明了返回int,但方法体内没有任何return语句,这会直接编译失败,得先把这个坑填上——比如根据逻辑在方法末尾加个return 1;(或者其他符合你业务需求的返回值),不然委托绑定根本没法进行。

核心前提:非静态方法必须依赖类实例

非静态方法属于类的实例对象,而不是类本身,所以绑定前必须先创建该方法所属类的实例。假设你的方法都在一个叫JobCandidate的类里(你可以替换成自己实际的类名),咱们先把完整的类结构理清楚:

// 自定义委托
public delegate int Delegate();

public class JobCandidate
{
    // 假设类里有这些字段(你原代码里用到了Age、YearExperience等)
    public int Age { get; set; }
    public int YearExperience { get; set; }
    public bool BachelorDegree { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }

    public new int WorkOffer()
    {
        if (Age >= 25 && YearExperience >= 1 && BachelorDegree == true)
        {
            Console.WriteLine("\nYou may be offered a job.");
            return 1;
        }
        else
        {
            Console.WriteLine("\nUnfortunately, there is no job for you.");
            return 0;
        }
    }

    // 修正后的Invitation方法,补充了return语句
    public int Invitation()
    {
        if (WorkOffer() == 1)
        {
            Console.WriteLine("Dear " + Name + " " + Surname + ", soon you will receive\n" + "an email with date and time...");
        }
        // 补充返回值,符合委托的返回类型要求
        return 1;
    }
}

步骤1:创建类的实例

因为是非静态方法,必须先实例化类对象才能引用方法:

// 创建JobCandidate的实例,并设置必要的属性值
JobCandidate candidate = new JobCandidate()
{
    Age = 26,
    YearExperience = 2,
    BachelorDegree = true,
    Name = "John",
    Surname = "Doe"
};

步骤2:绑定方法到委托

有两种常用的绑定方式,效果是一样的:

方式一:直接实例化委托(最常用)

// 绑定WorkOffer方法到委托
Delegate workOfferDelegate = candidate.WorkOffer;

// 绑定修正后的Invitation方法到委托
Delegate invitationDelegate = candidate.Invitation;

方式二:使用Delegate.CreateDelegate方法(更灵活的场景用)

// 绑定WorkOffer
Delegate workOfferDelegate = Delegate.CreateDelegate(typeof(Delegate), candidate, nameof(JobCandidate.WorkOffer));

// 绑定Invitation
Delegate invitationDelegate = Delegate.CreateDelegate(typeof(Delegate), candidate, nameof(JobCandidate.Invitation));

步骤3:调用委托

绑定完成后,就可以像调用方法一样调用委托了:

// 调用WorkOffer委托
workOfferDelegate();

// 调用Invitation委托
invitationDelegate();

关键注意点

  • 非静态方法绑定委托时,必须传入类的实例,不能像静态方法那样直接用类名.方法名。
  • 委托的签名(返回值+参数列表)必须和绑定的方法完全匹配,这也是为什么要先修正Invitation()的返回值问题。

内容的提问来源于stack exchange,提问作者Настя Шпит

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:35:42