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
相关产品推荐
相关产品推荐

