-7

ハードコーディングせずに、すべてのオブジェクトをリストに動的に追加したいと考えています。

コード:

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).
            }

        }
   }
4

2 に答える 2

6

あなたのコメントに基づいて:

「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<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 個の変数になります (静的ではありません)。

それにもかかわらず、これらの変数はすべて何らかのクラスに属します。プロジェクトのセットアップで 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) );

これはうまくいくかもしれませんが、一般的に、これは非常に脆弱なアプローチです: 適切な BindingFlags、適切なフィールド名、適切なフィールド型に注意する必要があり、コンパイラは Item へのキャストを自動的にチェックできず、セキュリティ上の問題さえあるかもしれませんたとえば、Silverlight で記述し、フィールドが非公開の場合に発生します。

于 2013-04-16T08:39:13.847 に答える
4
int count = Item.getCount();// count = 2

コンストラクターが呼び出され、ループ内のこのクラスの各インスタンスにアクセスしたいときに、Item クラスが「フードの下で」カウンターを増やしているように見えますか?

もしそうなら、あなたの最善の策は、Listを(プライベート)静的プロパティとしてItemクラス自体に直接追加し、コンストラクターにこのリストにAdd(this)を実行させるようです。それを公開することは、静的ReadOnlyCollection<Item>コレクションを介して行うことができます。

于 2013-04-16T06:50:20.423 に答える