2016-04-15 14 views
0

Ich bin auf der Suche nach einer Möglichkeit, eine neue Instanz einer Klasse mit einer Zeichenfolge als Name zu initialisieren, damit ich diese bestimmte Instanz in einer Liste finden kann ein späterer Punkt.Erstellen einer Instanz einer Klasse mit einem Namen in einer Zeichenfolge

Zur Zeit habe ich etwas entlang der Linien von diesem Code:

static List<ClassItem> classList = new List<ClassItem>(); 

private void updateClassList(Stream stream) 
{ 
    Message = Recieve(stream); 
    Interact(Message); //get the number of Classes about to be recieved 

    string ID; 
    string state; 

    for(int i = 0; i < numberOfClasses; i++) 
    { 
     Message = Recieve(stream); 
     interpretClassProperties(Message, out ID, out State); 

     ClassItem ID = new ClassItem(ID, state); //incorrect code 
     classList.Add(ID); //add new instance to list 
    } 
} 

Offensichtlich wird nicht funktionieren, da ich nicht eine Variable verwenden, kann eine Instanz der Klasse zu initialisieren, aber logisch zeigt es, was ich wollen erreichen. Jede Schleife fügt eine Instanz von ClassItem (mit dem entsprechenden ID-Wert als Name) zur classList hinzu, damit ich sie später finden kann.

Worauf muss ich achten, um dies zu erreichen?

Jede Rückmeldung wird geschätzt, einschließlich aller Warnungen vor zukünftigen Problemen, die ich möglicherweise habe, um das Problem auf diese Weise anzugehen. (Ich finde eine Klasseninstanz in einer Liste nach Namen).

+1

Mögliche Duplikat [C# instantiate Klasse von string] (http://stackoverflow.com/questions/2247598/c-sharp-instantiate-class-from-string) –

+0

Wie werden Sie brauchen „zu finden, dass bestimmter Fall zu einem späteren Zeitpunkt "? Es gibt ein paar Möglichkeiten zu tun, was Sie wollen, ich würde stattdessen eine 'Dictionary ' stattdessen verwenden. Wenn Sie eine bestimmte ID erhalten möchten, tun Sie einfach 'ClassItem thing = dictionary [ID]', wobei 'ID' eine String-ID ist (oder was auch immer Sie wollen, Sie können' Dictionary 'usw.) .) – Quantic

+0

@Quantic Die Verwendung eines Wörterbuchs anstelle einer Liste klingt wie ein potenzielles Fix. Auf diese Weise kann ich das Wörterbuch nach dem relevanten Schlüssel und dem Wert der Instanz der Klasse durchsuchen. In Bezug auf meine Lösung würde ich jedoch, wenn ich stattdessen ein Wörterbuch verwenden würde, Probleme bekommen, wenn meine Klassen dasselbe genannt würden. Zum Beispiel, es ist in einer for-Schleife und so würde jede neue Instanz "Ding" genannt werden (um Ihr Beispiel zu nehmen). – James

Antwort

0

Verwendung Activator.CreateInstance:

public static ObjectHandle CreateInstance(
    string assemblyName, 
    string typeName 
) 

Sie kennen Ihren Namen der Assembly und erhalten den Klassennamen (Typname).

MSDN: https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx

Beispielcode:

static List<object> classList = new List<object>(); 

private void updateClassList(Stream stream) 

    { 
     Message = Recieve(stream); 
     Interact(Message); //get the number of Classes about to be recieved 

     string id; 

     for(int i = 0; i < numberOfClasses; i++) 
     { 
      Message = Recieve(stream); 
      interpretClassProperties(Message, out id); 

      classList.Add(Activator.CreateInstance("AssemblyName", id).Unwrap()); 
     } 
    } 
+0

Ich habe mich mit dieser Lösung beschäftigt und alles scheint korrekt zu sein und funktioniert genau so, wie ich es in der Frage umrissen habe. Als Reaktion auf einen Kommentar scheint es mir in diesem Fall besser zu sein, ein Wörterbuch mit dem Schlüssel als Namen und Wert als Klasseninstanz zu verwenden. Dies als Antwort auf diese Antwort zu markieren und genau das zu tun, was ich ursprünglich beschrieben habe. – James

0

ist so etwas wie das, was Sie suchen? Aber Vorsicht, dies wird wahrscheinlich zu einem Albtraum in der Erinnerung führen, wenn Sie Ihre Instanzen nicht von der statischen Liste dereferenzieren.

public class ClassWithIds 
{ 
    public static List<ClassWithIds> Instances = new List<ClassWithIds>(); 

    private static int _idSeed = 0; 

    private readonly string _name; 

    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
    } 

    private static int NextId() 
    { 
     return Interlocked.Increment(ref _idSeed); 
    } 

    public ClassWithIds() 
    { 
     _name = this.GetType().FullName + " Number " + NextId(); 
     Instances.Add(this); 
    } 
} 
Verwandte Themen