如何在静态类中使用Type.GetMethods?控制台命令获取失败
解决Type.GetMethods获取不到CommandsList方法的问题
嘿,我之前也踩过这个坑!你遇到的问题大概率是BindingFlags参数没传对,因为Type.GetMethods()默认只返回公共实例方法,如果你的命令方法是静态的,或者没明确指定Flags,就会拿不到。下面给你一步步排查和解决:
1. 先检查BindingFlags的正确使用
你得根据自己的方法类型,给GetMethods传递对应的BindingFlags组合:
- 如果是公共实例方法:
var methods = typeof(CommandsList).GetMethods(BindingFlags.Public | BindingFlags.Instance); - 如果是公共静态方法:
var methods = typeof(CommandsList).GetMethods(BindingFlags.Public | BindingFlags.Static); - 要同时获取实例和静态的公共方法:
var allPublicMethods = typeof(CommandsList).GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - 如果你的方法是非公共的(比如internal/private),还要加上
BindingFlags.NonPublic,比如拿私有实例方法:var privateMethods = typeof(CommandsList).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
2. 确认Type获取是否正确
别小看这一步!比如:
- 如果
CommandsList是嵌套在另一个类里的(比如Game.CommandsList),你得用typeof(Game.CommandsList)而不是只写typeof(CommandsList) - 如果你是通过实例获取Type(比如
someCommandsInstance.GetType()),要确保这个实例确实是CommandsList的实例,而不是它的子类(子类的GetType会返回子类的Type,可能没有你要的方法)
3. 排除继承来的方法(可选)
默认情况下GetMethods会返回父类继承来的方法(比如Object.ToString()、Equals()),如果你只想拿到CommandsList自己定义的方法,加上BindingFlags.DeclaredOnly:
var declaredMethods = typeof(CommandsList).GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
举个实际例子
假设你的CommandsList类是这样的:
public class CommandsList { public void Move() { } public static void Quit() { } private void DebugLog() { } }
- 要拿到
Move和Quit:用BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static - 要拿到
DebugLog:用BindingFlags.NonPublic | BindingFlags.Instance
按这个思路调整你的代码,应该就能拿到所有你需要的命令方法了!
内容的提问来源于stack exchange,提问作者Caleb Libby
相关产品推荐
相关产品推荐

