Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在检索具有指定类型的字段的值_C#_.net_Winforms_Reflection_Refactoring - Fatal编程技术网

C# 正在检索具有指定类型的字段的值

C# 正在检索具有指定类型的字段的值,c#,.net,winforms,reflection,refactoring,C#,.net,Winforms,Reflection,Refactoring,我有以下代码,它是表单中的一个私有方法,可以从表单中检索所有上下文菜单。我觉得它并没有它应该的那么简洁。如有任何建议,我将不胜感激 private IEnumerable<ContextMenuStrip> GetContextMenus() { var type = this.GetType(); var fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Insta

我有以下代码,它是表单中的一个私有方法,可以从表单中检索所有上下文菜单。我觉得它并没有它应该的那么简洁。如有任何建议,我将不胜感激

  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>();        
    }
private IEnumerable 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));
返回菜单。Cast();
}

您是否愿意包含ContextMenuStrip的子类?如果是这样,我会使用:

return GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                .Select(field => field.GetValue(this))
                .OfType<ContextMenuStrip>();
return GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Select(field=>field.GetValue(此))
.of type();

您是否愿意包含ContextMenuStrip的子类?如果是这样,我会使用:

return GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                .Select(field => field.GetValue(this))
                .OfType<ContextMenuStrip>();
return GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Select(field=>field.GetValue(此))
.of type();
var query=(从GetType()中的f开始)。GetFields(
BindingFlags.NonPublic | BindingFlags.Instance)
选择类型()的f.GetValue(this));
var query=(从GetType()中的f开始)。GetFields(
BindingFlags.NonPublic | BindingFlags.Instance)
选择类型()的f.GetValue(this));

如果该代码在表单中,您可能希望完全避免反射,只需在控件集合上循环,例如:

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;
IEnumerable结果=新列表();
foreach(控件中的var控件)
{
ContextMenuStrip menuStrip=(控件作为ContextMenuStrip)
if(menuStrip!=null)
{
结果。添加(菜单提示);
}
}
返回结果;

如果该代码在表单中,您可能希望完全避免反射,只需在控件集合上循环,例如:

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;
IEnumerable结果=新列表();
foreach(控件中的var控件)
{
ContextMenuStrip menuStrip=(控件作为ContextMenuStrip)
if(menuStrip!=null)
{
结果。添加(菜单提示);
}
}
返回结果;

谢谢您的精彩回答!谢谢你的回答!非常感谢。我有两个答案,两种不同的询问方式。两者都很棒。我不知道该接受哪一个。谢谢。我有两个答案,两种不同的询问方式。两者都很棒。我不知道我应该接受哪一个。:)查看字段与查看控件集合是不同的。不是所有控件都是字段,也不是所有字段(直接)都在控件集合中(即使它们是控件)。所以这是一个有效的答案,但它有不同的作用。我完全同意,但反思通常是过火的。我承认OP对字段的定义是明确的,但如果有人首先发现它,我会把这个答案留在这里。顺便说一句,int字段不在控件集合中,但是控件怎么可能不是字段呢?查看字段与查看控件集合不同。不是所有控件都是字段,也不是所有字段(直接)都在控件集合中(即使它们是控件)。所以这是一个有效的答案,但它有不同的作用。我完全同意,但反思通常是过火的。我承认OP对字段的定义是明确的,但如果有人首先发现它,我会把这个答案留在这里。顺便说一句,int字段不在控件集合中,但是控件怎么可能不是字段呢?