Val*_*oth 3 c# reflection interface
我目前正在尝试获得一组非常具体的方法,但我没有这样做.我需要从实现特定接口的所有类中获取与特定签名匹配的所有方法.
到目前为止我得到的是:
IEnumerable<System.Type> classes = Assembly.GetAssembly(typeof(IActionMethod)).GetTypes().Where(x => x.GetInterface("IActionMethod") != null);
MethodInfo[] methods;
List<MethodInfo> relevant;
ParameterInfo[] parameters;
foreach(System.Type cls in classes)
{
methods = cls.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public);
relevant.Clear();
for(int i = 0; i < methods.Length; i++)
{
parameters = methods[i].GetParameters();
if(parameters.Length == 1 && parameters[0].GetType() == typeof(GameObject) && methods[i].ReturnType == typeof(void))
relevant.Add(methods[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
此代码已失败,GetMethods(..)但未返回任何方法.我不明白的是,如果没有实现接口,我可以接收任何相关类的所有公共方法.
界面本身不包含任何内容,我只是用它来"标记"相关的类,因为我无法提出任何其他解决方案.
任何人都可以告诉我为什么界面渲染GetMethods无用或指向我上面的代码中的错误?
我怀疑这是问题所在:
foreach(System.Type cls in classes)
{
methods = cls.GetType().GetMethods(...)
Run Code Online (Sandbox Code Playgroud)
cls已经是一个Type,所以调用GetType()它将返回System.Type(或子类).我怀疑你只想要:
foreach(System.Type cls in classes)
{
methods = cls.GetMethods(...)
Run Code Online (Sandbox Code Playgroud)
还不清楚为什么要relevant在每次迭代时清除列表.这意味着最后的唯一条目将是你看到的最后一堂课 - 你确定这是你想要的吗?