Получение значений полей указанного типа - PullRequest
1 голос
/ 02 марта 2011

У меня есть следующий код, который является закрытым методом внутри формы и извлекает все контекстные меню из формы. Я чувствую, что это не так кратко, как должно быть. Был бы признателен за любые предложения.

  private IEnumerable<ContextMenuStrip> GetContextMenus()
    {
        var type = this.GetType();
        var fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
        var contextMenus = fields.Where(f => f.GetValue(this).GetType() == typeof(ContextMenuStrip));
        var menus = contextMenus.Select(f=> f.GetValue(this));
        return menus.Cast<ContextMenuStrip>();        
    }

Ответы [ 3 ]

3 голосов
/ 02 марта 2011

Вы счастливы включить подклассы ContextMenuStrip?Если это так, я бы использовал:

return GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                .Select(field => field.GetValue(this))
                .OfType<ContextMenuStrip>();
1 голос
/ 02 марта 2011
var query = (from f in GetType().GetFields(
                 BindingFlags.NonPublic | BindingFlags.Instance)
            select f.GetValue(this)).OfType<ContextMenuStrip>();
0 голосов
/ 02 марта 2011

Если этот код находится в форме, вы можете вообще отказаться от рефлексии и просто перебрать коллекцию Controls, например:

var controls = from Control c in Controls.AsQueryable()
               where c is ContextMenuStrip
               select c;

или вариант без LINQed

IEnumerable<ContextMenuStrip> result = new List<ContextMenuStrip>();
foreach (var control in Controls)
{
   ContextMenuStrip menuStrip = (control as ContextMenuStrip)
   if (menuStrip != null )
   {
     result.Add(menuStrip);
   }
}
return result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...