获取给定返回类型的所有方法
问题描述:
这段代码错了吗?它只是没有返回任何东西:获取给定返回类型的所有方法
public IEnumerable<string> GetMethodsOfReturnType(Type cls, Type ret)
{
var methods = cls.GetMethods(BindingFlags.NonPublic);
var retMethods = methods.Where(m => m.ReturnType.IsSubclassOf(ret))
.Select(m => m.Name);
return retMethods;
}
它返回一个空的枚举器。
注:我称它在ASP.NET MVC控制器寻找ActionResults
GetMethodsOfReturnType(typeof(ProductsController), typeof(ActionResult));
答
其他指出了修正,但我想建议一个替代IsSubclassOf
以及包括公共方法:
public IEnumerable<string> GetMethodsOfReturnType(Type cls, Type ret)
{
// Did you really mean to prohibit public methods? I assume not
var methods = cls.GetMethods(BindingFlags.NonPublic |
BindingFlags.Public |
BindingFlags.Instance);
var retMethods = methods.Where(m => m.ReturnType.IsAssignableFrom(ret))
.Select(m => m.Name);
return retMethods;
}
使用IsAssignableFrom
,您不需要额外的“是与所需类型完全相同的返回类型”测试,并且它也可以与接口一起使用。
+2
很难知道,但我会假设在生产代码中,感兴趣的控制器操作只会是公开的,可能仅由那些不具有NonActionAttribute的操作进行过滤。 – tvanfosson 2010-04-22 17:38:37
+0
你是对的tvanfsoon。 +1为您的洞察! – Aren 2010-04-22 17:41:31
答
BindingFlags.NonPublic | BindingFlags.Instance
Where(m => ret == m.ReturnType || m.ReturnType.IsSubclassOf(ret))
答
两个变化,这些变化可能使这项工作:
public IEnumerable<string> GetMethodsOfReturnType(Type cls, Type ret)
{
var methods = cls.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance);
var retMethods = methods.Where(m => m.ReturnType.IsSubclassOf(ret) || m.ReturnType == ret)
.Select(m => m.Name);
return retMethods;
}
不要ActionResult方法需要公开才能被调用? – GalacticCowboy 2010-04-22 17:37:18