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" 

Hier ist meine Frage. Kann ich überhaupt alle Objekte von ClassA mit typeof (ClassA) bekommen? Oder ist das anders? Vielen Dank für Ihre Hilfemit typeof(), um nach allen Objekten zu suchen

+1

Was meinst du mit "alles Objekt"? Möchten Sie auf das 'num'-Feld zugreifen? In diesem Fall brauchen Sie eine Reflektion, etwa 'a.GetType(). GetField (" num ")'. – HimBromBeere

+1

Versuchen Sie, alle _current-Instanzen_ eines bestimmten Typs zu erhalten, in diesem Fall 'ClassA'? Weil Sie [das nicht können] (http://stackoverflow.com/questions/302542/how-do-i-get-all-instances-of-all-loaded-types-that-implement-a -given-interface) – stuartd

+1

Was ist Ihre wirkliche Anforderung? Dieser Reflexionsansatz scheint der letzte Weg zu sein, den Sie in Betracht ziehen sollten. Warum speichern Sie die Zahlen nicht in einer 'Liste ' oder den Instanzen in einer 'Liste '? –

Antwort

0

Wenn Sie wollen

alle Objekt von KlasseA erhalten

Sie können die ClassA Instanzen in eine Sammlung, sagen wir, Array und dann organisieren verwenden 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 Hier gibt es keine Möglichkeit, alle Instanzen einer Klasse zu erhalten, die in Ihrer Methode, Ihrem Thread oder was auch immer existieren. Sie müssen sich diese selbst merken. Dies ist jedoch nicht wirklich notwendig.

Stellen Sie vier verschiedene Autos haben:

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

Jetzt haben Sie Möglichkeiten: entweder daran denken, die Variablennamen und versuchen, das Auto, das sie mit diesem Namen vertreten zu bekommen (was möglich isn't wie finden Sie in Kürze) oder Ihr alle Car -instances in einer einzigen Sammlung setzen:

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

Sie nun für die Namen dieser Variablen won't Pflege, wie Sie direkten Zugang zu ihnen haben. Sie können sie zum Beispiel durch diese zuzugreifen:

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

Oder alternativly:

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

C# hat keine API alle Objekte abzurufen. Daher müssen Sie Ihren eigenen Code schreiben.

public class ClassA 
{ 
    int num = 10; 

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

Verwenden Sie eine statische Liste, um die erstellten Objekte zu speichern.

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 

von Speicherlecks Seien Sie vorsichtig und sobald Objekte aus der Liste entfernen, wie verwendet.

+0

Dies ist eine sehr schlechte Idee, da die Objekte niemals finalisiert werden (Speicherleck). Es sollte mindestens WeakReference sein. – CSharpie

+0

Sie müssen berücksichtigen, wenn Davis diese Objekte abruft.Wenn Sie WeakReference rücksichtslos verwenden, werden Objekte versehentlich zerstört. – Tommy

Verwandte Themen