【问题标题】:Is it possible to get a reference to MyList<Object> if the listname is a string "myList"如果列表名是字符串“myList”,是否可以获得对 MyList<Object> 的引用
【发布时间】:2013-05-08 20:13:30
【问题描述】:

我有一些ObservableCollection&lt;SampleObject&gt;类型的列表
它们都以字母表中的一个字母结尾:lista、listb、listc...
现在我想创建一个遍历字母表的循环,并且在每个字母处都应该将一个项目添加到当前列表中。

例子:

for (char i = 'a'; i < 'z'; i++)  
{  
    string name = "list" + i;
    name.Add(.....);
}

本例中的“名称”应该是我要添加项目的列表。

【问题讨论】:

  • 技术上可以使用 Reflection...但我会接受 @SLaks 的字典建议。使用反射有很好的案例;这不是其中之一。
  • 我在 stackoverflow 上看到了一些使用反射的问题,但我没有找到解决问题的方法,因为我不想获取/设置列表的属性。我想使用 列表 和字符串

标签: c# .net string properties dictionary


【解决方案1】:

您想要一个Dictionary&lt;char, ObservableCollection&lt;SampleObject&gt;&gt;,每个char 都有不同的集合。

【讨论】:

  • 是否有任何其他解决方案可以保留我制作的列表,因为我已经完成了我的方法和绑定?
  • @thalers 你不会想要使用这样的解决方案,即使它可以在 C# 中使用。这与语言的设计背道而驰。
【解决方案2】:

如果您的列表是在类级别声明的,则可以使用反射来获取对它们的引用(我仍然认为字典是更好的选择)。

简单示例:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private List<string> lista = new List<string>();

    private void button1_Click(object sender, EventArgs e)
    {
        Console.WriteLine("Before:");
        foreach (string value in lista)
        {
            Console.WriteLine(value);
        }

        for (char i = 'a'; i < 'z'; i++)  
        {  
            string name = "list" + i;
            System.Reflection.FieldInfo fi = this.GetType().GetField(name, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public);
            if (fi != null && fi.FieldType.Equals(typeof(List<string>)))
            {
                List<string> referenceToList = (List<string>)fi.GetValue(this);
                referenceToList.Add("Hello!");
            }
        }

        Console.WriteLine("After:");
        foreach (string value in lista)
        {
            Console.WriteLine(value);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 2023-02-24
    • 2011-12-11
    • 2015-08-16
    • 2015-12-09
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多