C#:将对象添加到列表<;T>;类
本文关键字:lt gt 列表 对象 添加 | 更新日期: 2023-09-27 18:09:36
我想动态地将我的所有对象添加到列表中,而不需要任何硬编码。
代码:
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).
}
}
}
基于您的评论:
如果您多次创建"static Item objA=new Item((",最终得到:
static Item objA = new Item();
static Item objB = new Item();
....
static Item objZ = new Item();
然后要将它们全部放入列表中,您几乎没有其他方法,只能:
list = new List<Item>;
list.Add(objA);
list.Add(objB);
...
list.Add(objZ);
这是因为您已经创建了这些项,并且已经将它们放入几十个不同的变量中,要将它们放入列表中,您只需告诉编译器应该从哪里获取它们。这意味着,你必须告诉他从objA变量、objB变量和(…(等等得到它。这是因为你在不同的变量中有它们。
关键是你一开始就应该选择错误的方式。你不应该一开始就创建"objA,objB,objC,…,objZ"。它应该是一个列表、数组、Dictionary或任何集合,这样您就可以轻松地同时访问所有项。它们不应该被放入单独的变量中。
如果可以的话,不要创建可能的变量。例如,使用字典:
Dictionary<string, Item> items = new Dictionary<string, Item>();
items["A"] = new Item();
items["B"] = new Item();
...
items["Z"] = new Item();
现在,你可以很容易地找到一个项目:
items["F"].Something = 321;
items["O"].Something = 123;
您也可以同样轻松地访问所有项目:
var number = items.Values.Count;
itemList = new List<Item>( items.Values );
当然,有时候你就是没有这样的选择。例如,WinForms Designer为您创建变量,如果您在窗体上放置100个标签,您几乎总是会有100个变量(尽管从来不是静态的(。
尽管如此,所有这些变量都将位于某个类中。如果您的项目设置允许您使用反射,那么您可以检查该类并获得名称/属性列表,然后您可以读取它们的值:
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) );
这可能对您有效,但总的来说,这是一种非常脆弱的方法:您必须注意正确的BindingFlags、正确的字段名和正确的字段类型,并且编译器无法自动检查到Item的强制转换,甚至如果您在Silverlight上编写,并且您的字段是私有的,则可能会出现一些安全问题。
int count = Item.getCount();// count = 2
在我看来,当调用构造函数时,您的Item类"在引擎盖下"增加了一个计数器,并且您想访问循环中该类的每个实例?
如果是这样的话,最好将List作为(私有(静态属性直接添加到Item类本身,并让构造函数将(this(添加到该列表中。然后可以通过静态ReadOnlyCollection<Item>
集合来进行公开。