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

C#抽象类构造函数中获取含Callback特性的自身及子类方法

解决:在抽象类构造函数中获取子类带Callback特性的方法

问题场景

需要在抽象类BaseScript的构造函数中,获取当前实例(包含其具体子类)所有标记了[Callback]特性的方法。例如实例为SomeScript时,要获取标记了[Callback("transaction")]的Transaction方法,排除未标记的GetBalance方法。

原代码结构:

public abstract class BaseScript
{
    protected readonly CallbacksDictionary Callbacks;

    protected BaseScript(CallbacksDictionary callbacks)
    {
        // 需要获取所有带[Callback]特性的方法(包括子类)
        var methodsWithCallbackAttr = // 待实现
    }
}
public class SomeScript : BaseScript {
    public SomeScript(CallbacksDictionary callbacks) : base(callbacks) { }

    [Callback("transaction")]
    internal Task<bool> Transaction(int amount) {
       // 需要获取该方法
    }

    internal Task<bool> GetBalance(int accountId) {
         // 需排除该方法
    }
}

原代码问题

之前尝试的代码只能获取BaseScript中的方法,无法拿到子类的方法:

var callbackMethods = GetType().GetMethods()
    .Where(m => m.GetCustomAttributes(typeof(CallbackAttribute), true).Length > 0);

原因是GetType().GetMethods()默认只检索公共(Public)方法,而子类中的目标方法是internal(内部访问级别,属于非公共范畴),因此被过滤掉了。

解决方案

需要指定BindingFlags参数,明确包含实例、公共和非公共方法,再筛选带CallbackAttribute的方法:

var callbackMethods = GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
    .Where(m => m.GetCustomAttributes(typeof(CallbackAttribute), inherit: true).Any());

关键说明

  • BindingFlags.Instance:指定检索实例方法(排除静态方法)
  • BindingFlags.Public | BindingFlags.NonPublic:同时检索公共和非公共方法(覆盖internal、protected等访问级别)
  • GetCustomAttributes(..., inherit: true):如果需要继承自父类的特性可以保留true,若只需要当前类自身标记的特性,可改为false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:45:39