C# winforms上的反射问题

C# winforms上的反射问题,c#,winforms,reflection,C#,Winforms,Reflection,我有一个winforms应用程序 我有一个填充方法,在tabcontrol的每个页面上创建一组控件。Populate方法有两个参数——tab页和一个包含一组标签字符串的列表。每个选项卡页都有一个单独的列表,列表的名称与选项卡页的名称相同。我希望遍历这些页面,并通过名称将适当的列表传递给Populate方法,即通过作为其名称的字符串传递列表。据我所知,我需要反思一下 代码: 名称空间测试 { 公共部分类Form1:Form { List Hongdoe=新列表(新字符串[]{“Chin”、“Foa

我有一个winforms应用程序

我有一个填充方法,在tabcontrol的每个页面上创建一组控件。Populate方法有两个参数——tab页和一个包含一组标签字符串的列表。每个选项卡页都有一个单独的列表,列表的名称与选项卡页的名称相同。我希望遍历这些页面,并通过名称将适当的列表传递给Populate方法,即通过作为其名称的字符串传递列表。据我所知,我需要反思一下

代码:

名称空间测试
{
公共部分类Form1:Form
{
List Hongdoe=新列表(新字符串[]{“Chin”、“Foa”、“Hu”、“Dan”});
List Donfu=新列表(新字符串[]{“Faa”、“Su”、“Pi”、“Mou”});
//TabPage1.Name=Hongdoe
//TabPage2.Name=Donfu
foreach(Tab_控件中的TabPage tp.TabPages)
{
//我想告诉程序“查找名为'tp.Name'的变量/列表”
var ListName=typeof(Form1).GetField(tp.Name)
填充(tp,列表名);
}
}
无效填充(选项卡页tp,列表)
{
for(int i=0;i
但到目前为止,它返回null。我还尝试使用“GetProperty”、“GetValue”,但没有成功


(在我编辑这个问题之前,我使用了一个变量来简单地演示我的问题)

您不需要使用反射。您可以使用
字典
,使用列表名称(选项卡页面名称)作为键,使用字符串列表作为值。然后您可以使用字典中的键获取列表

Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
private void ProductList_Load(object sender, EventArgs e)
{
    //Initialize dictionary with keys and values
    dictionary["page1"] = new List<string> { "string 1", "string 2" };
    dictionary["page2"] = new List<string> { "string 3", "string 4" };
    //...
}

  • 您不需要将列表传递给方法,只需将
    TabPage
    传递给方法即可,您可以使用
    dictionary[TabPage.Name]

  • 您可以在选项卡页面中使用
    TableLayoutPanel
    FlowLayoutPanel
    添加标签。这样,标签将自动排列

  • 仅用于学习目的,如果您想使用反射:

    var list = (List<string>)this.GetType().GetField("Hongdoe", 
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance).GetValue(this);
    
    var list=(list)this.GetType().GetField(“Hongdoe”,
    System.Reflection.BindingFlags.NonPublic|
    System.Reflection.BindingFlags.Instance.GetValue(this);
    

您不需要使用反射。您可以使用
字典
并使用列表名称(选项卡页面名称)作为键,使用字符串列表作为值。然后您可以使用字典中的键获取列表

Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>();
private void ProductList_Load(object sender, EventArgs e)
{
    //Initialize dictionary with keys and values
    dictionary["page1"] = new List<string> { "string 1", "string 2" };
    dictionary["page2"] = new List<string> { "string 3", "string 4" };
    //...
}

  • 您不需要将列表传递给方法,只需将
    TabPage
    传递给方法即可,您可以使用
    dictionary[TabPage.Name]

  • 您可以在选项卡页面中使用
    TableLayoutPanel
    FlowLayoutPanel
    添加标签。这样,标签将自动排列

  • 仅用于学习目的,如果您想使用反射:

    var list = (List<string>)this.GetType().GetField("Hongdoe", 
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance).GetValue(this);
    
    var list=(list)this.GetType().GetField(“Hongdoe”,
    System.Reflection.BindingFlags.NonPublic|
    System.Reflection.BindingFlags.Instance.GetValue(this);
    

这听起来不是反射的正确用法。您能提供一些关于您需要能够执行的操作的更多上下文吗?请注意“变量”、“属性”和“字段”“在C#中是非常不同的概念。类没有变量-请说明这将澄清您的问题。这听起来不是反射的正确用法。你能提供一些关于你需要做什么的上下文吗?请注意,“变量”、“属性”和“字段”在C#中是非常不同的概念。类没有变量-请表明这将澄清您的问题。谢谢您的建议!然而,我仍然更愿意使用反射,至少我想学习使用反射。但我肯定会研究TableLayoutPanel和FlowLayoutPanel!不客气。没问题,你可以学习反射,但在你学会如何使用反射后,回来用字典代替,因为这是解决这个问题的方法。@mathgenius如果你对答案有任何疑问,请告诉我:)谢谢,我只是还没有时间写任何东西。当我尝试它时,我会让你知道的。所以反射是有效的,但是让我确定,“实例”绑定标志被设置为表示我们正在当前执行的实例中搜索,对吗?另外,我认为需要“NonPublic”标志,因为我的列表没有设置“Public”属性?另外,我们为什么告诉它“GetValue(this)”?“this”不是表单吗?它是如何与“GetValue”方法相结合的,尤其是当我认为“GetValue”将返回一个值时,例如列表中第一个位置的字符串。谢谢你的建议!然而,我仍然更愿意使用反射,至少我想学习使用反射。但我肯定会研究TableLayoutPanel和FlowLayoutPanel!不客气。没问题,你可以学习反射,但在你学会如何使用反射后,回来用字典代替,因为这是解决这个问题的方法。@mathgenius如果你对答案有任何疑问,请告诉我:)谢谢,我只是还没有时间写任何东西。当我尝试它时,我会让你知道的。所以反射是有效的,但是让我确定,“实例”绑定标志被设置为表示我们正在当前执行的实例中搜索,对吗?另外,我认为需要“NonPublic”标志,因为我的列表没有设置“Public”属性?另外,我们为什么告诉它“GetValue(this)”?“this”不是表单吗?它是如何与“GetValue”方法联系在一起的,尤其是当我认为“GetValue”将返回一个值时,例如,位于第一个位置的字符串