2016-06-29 7 views
-2
public class ClassA 
{ 
    int num = 10; 
} 

ClassA a = new ClassA(); 
ClassA b = new ClassA(); 
ClassA c = new ClassA(); 
a.GetType(); //we can get result "ClassA" 

ここは私の質問です。とにかく、私はtypeof(ClassA)を使ってClassAのObjectをすべて取得できますか?それとも他の方法ですか?typeof()を使用してすべてのオブジェクトを検索する

はあなたが、たとえば、配列コレクションにClassAインスタンスを整理してから使用することにClassA

のすべてのオブジェクトを取得し、あなたがしたい場合は、あなたの種類の助け

+1

「すべてのオブジェクト」とはどういう意味ですか? 'num'フィールドにアクセスしますか?この場合、 'a.GetType()。GetField(" num ")'のようなリフレクションが必要になります。 – HimBromBeere

+1

特定のタイプのすべての_currentインスタンスを取得しようとしていますか?この場合は 'ClassA'ですか?あなたは[それをすることができなくなる]ため(http://stackoverflow.com/questions/302542/how-do-i-get-all-instances-of-all-loaded-types-that-implement-a -given-interface) – stuartd

+1

本当の必要条件は何ですか?この反射アプローチは、あなたが考慮する必要がある最後の方法だと思われます。あなたは 'List 'や 'List 'のインスタンスにnumを格納しないのはなぜですか? –

答えて

0

てくれてありがとうLinq

Object[] source = new Object[] { 
    "String", 
    new ClassA(), // this 
    new Object(), 
    new ClassA(), // and this should be filtered out 
    null 
}; 

... 

ClassA[] result = source 
    .OfType<ClassA>() 
    .Where(item => item != null) // you may want this filter 
    .ToArray(); 
0

Tメソッド、スレッドなどに存在するクラスのインスタンスをすべて取得する方法はありません。自分でそれらを覚えておく必要があります。しかし、これが本当に必要ではありません。今、あなたはオプションに持って

Car c1 = new Car(); 
Car c2 = new Car(); 
Car c3 = new Car(); 
Car c4 = new Car(); 

:いずれかの変数の名前を覚えているし、彼らはあなたが見つかりますよう可能isn'tその名前(で表し車を取得しよう

あなたは、4台の異なる車を持っている想像してみてもうすぐ)または単一のコレクションにすべてのあなたのCar -instancesを置く:あなたがそれらへの直接アクセスを持っているとして、今、あなたはこれらの変数の名前のためのケアをwon't

List<Car> cars = new List<Car>(); 
cars.Add(c1); 
cars.Add(c2); 
cars.Add(c3); 
cars.Add(c4); 

。あなたは、例えば、このことによって、それらにアクセスすることができます。

Car myCar = cars.Single(x => x.Name == "BMW"); 

またはalternativly:

Car myCar = cars[1]; // get the second car within the collection 
-2

C#がすべてのオブジェクトを取得するには何のAPIを持っていません。したがって、独自のコードを記述する必要があります。

public class ClassA 
{ 
    int num = 10; 

    public static List<ClassA> Objects { get; } = new List<ClassA>(); 
    public ClassA() 
    { 
     objects.Add(this); 
    } 
} 

作成したオブジェクトを静的リストで保存します。

ClassA a = new ClassA(); 
ClassA b = new ClassA(); 
ClassA c = new ClassA(); 

Console.WriteLine(ClassA.Objects[0]); //a 
Console.WriteLine(ClassA.Objects[1]); //b 
Console.WriteLine(ClassA.Objects[2]); //c 

メモリリークに注意し、使用するとすぐにリストからオブジェクトを削除してください。

+0

オブジェクトは決してファイナライズされないので、これは非常に悪い考えです(メモリリーク)。少なくとも弱い参照であるべきです。 – CSharpie

+0

Davisがこれらのオブジェクトを取得するタイミングを考慮する必要があります。WeakReferenceを慎重に使用すると、オブジェクトが誤って破壊されることになります。 – Tommy

関連する問題