Получить все методы с заданным типом возврата - PullRequest
3 голосов
/ 22 апреля 2010

Этот код неправильный?Он просто ничего не возвращает:

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

Ответы [ 3 ]

11 голосов
/ 22 апреля 2010

Другие отметили исправления, но я хотел бы предложить альтернативу 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, выне нужно иметь дополнительный тест «тип возврата точно такой же, как и требуемый тип», а также он будет работать с интерфейсами.

1 голос
/ 22 апреля 2010

Два изменения, которые могли бы сделать эту работу:

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;
}
1 голос
/ 22 апреля 2010
BindingFlags.NonPublic | BindingFlags.Instance

Where(m => ret == m.ReturnType || m.ReturnType.IsSubclassOf(ret))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...