C#:动态地将对象添加到List <T>类中

kin*_*jia -8 c# list

我想动态地将我的所有对象添加到List中,而不需要任何硬编码.

码:

static void Main(string[] args)
    {
        Item objA = new Item();
        Item objB = new Item();
        int count = Item.getCount();// count = 2

        List<Item> cont1 = new List<Item>();
        while (count > 0)
        {
            for (int i = 0; i < count; i++)
            {
                cont1.Add();
                //I missing an instance to get the objA and objB into cont1
                //I dont want hard code it, e.g: cont1.Add(objA).
            }

        }
   }
Run Code Online (Sandbox Code Playgroud)

que*_*atl 5

根据你的评论:

如果你多次创建'static Item objA = new Item()',那么你最终得到:

static Item objA = new Item();
static Item objB = new Item();
....
static Item objZ = new Item();
Run Code Online (Sandbox Code Playgroud)

然后把它们全部放入一个列表,你几乎没有别的办法:

list = new List<Item>;
list.Add(objA);
list.Add(objB);
...
list.Add(objZ);
Run Code Online (Sandbox Code Playgroud)

这是因为你已经创建了这些项目,并且已经将它们放入几个不同的变量中并将它们放入列表中,你只需告诉编译器它应该从哪里获取它们.这意味着,您必须告诉他从objA变量,objB变量和(...)等获取它.这是因为你有不同的变量.

关键是你应该从一开始就选择错误的方式.你永远不应该首先创建"objA,objB,objC,....,objZ".它应该是列表或数组或字典或任何集合,以便您可以轻松地一次访问所有项目.它们不应该被放入单独的变量中.

如果可以,请不要创建可能的变量.例如,使用字典:

Dictionary<string, Item> items = new Dictionary<string, Item>();
items["A"] = new Item();
items["B"] = new Item();
...
items["Z"] = new Item();
Run Code Online (Sandbox Code Playgroud)

现在,你可以轻松地找到一个项目:

items["F"].Something = 321;
items["O"].Something = 123;
Run Code Online (Sandbox Code Playgroud)

您也可以轻松访问所有项目:

var number = items.Values.Count;

itemList = new List<Item>( items.Values );
Run Code Online (Sandbox Code Playgroud)

当然,有时你只是没有这样的选择.例如,WinForms Designer为您创建变量,如果您在表单上放置100个标签,您几乎总会得到100个变量(尽管从不静态).

尽管如此,所有这些变量都会出现在某个类中.如果您的项目设置允许您使用Reflection,那么您可以检查该类并获取名称/属性列表,并且您可以读取它们的值:

class X
{
    public static Item objA = new Item();
    ..., objB, objC, ..... ,.....,
}

...

List<Item> items = new List<Item>();
foreach (var field in typeof(ListaUczniow).GetFields(BindingFlags.Static | BindingFlags.Public))
    if (field.Name.StartsWith("obj") && field.FieldType == typeof(Item))
        items.Add( (Item) field.GetValue(null) );
Run Code Online (Sandbox Code Playgroud)

这可能对您有用,但一般来说,这是一个非常脆弱的方法:您必须注意正确的BindingFlags,正确的字段名称,正确的字段类型,并且编译器无法自动检查转换为Item,甚至可能出现一些安全问题如果您在Silverlight上编写ie并且您的字段是私有的,则会出现.