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字段不在控件集合中,但是控件怎么可能不是字段呢?