2010-04-22 75 views
3

这段代码错了吗?它只是没有返回任何东西:获取给定返回类型的所有方法

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)); 
+0

不要ActionResult方法需要公开才能被调用? – GalacticCowboy 2010-04-22 17:37:18

回答

11

其他指出了修正,但我想建议一个替代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

1
BindingFlags.NonPublic | BindingFlags.Instance 

Where(m => ret == m.ReturnType || m.ReturnType.IsSubclassOf(ret)) 
1

两个变化,这些变化可能使这项工作:

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; 
}