2016-03-21 10 views
5

Ich möchte eine Klasse mit mehreren geschachtelten Klassen haben, sodass beim Erstellen einer neuen übergeordneten Klasse ein Objekt jeder geschachtelten Klasse erstellt wird und ich global auf die Variablen innerhalb jeder geschachtelten Klasse verweisen kann.Referenzieren geschachtelter Klassenobjekte in C#

Hier ist mein aktueller Code:

public class StockChecklist 
{ 
    public class qty1p1 { public string tag = "uniqueval23456"; public string value = ""; public string reference = ""; } 
    public class qty1p2 { public string tag = "uniqueval3736"; public string value = ""; public string reference = ""; } 

    public class qty2 { public string tag = "uniqueval97357"; public string value = ""; public string reference = ""; } 

    public class qty3p1 { public string tag = "uniqueval88356"; public string value = ""; public string reference = ""; } 
    public class qty3p2 { public string tag = "uniqueval62346"; public string value = ""; public string reference = ""; } 
    public class qty3p3 { public string tag = "uniqueval09876"; public string value = ""; public string reference = ""; } 
    public class qty3p4 { public string tag = "uniqueval62156"; public string value = ""; public string reference = ""; } 

    public class qty4 { public string tag = "uniqueval25326"; public string value = ""; public string reference = ""; } 

}

dann erstelle mir ein neues übergeordnetes Objekt mit:

StockChecklist theCurrentList = new StockChecklist();

aber wie die 'Tag' verschachtelten Objekte zuzugreifen, 'Wert' und ‚Referenz '? Ich hoffte auf etwas Einfaches wie StockChecklist.qty1p1.tag = 'changedval999999999';

Ist so etwas mit C# möglich?

+1

Es ist sehr unklar * warum * Sie haben alle diese kryptisch-and-unkonventionell genannten verschachtelten Klassen. Kannst du mehr Kontext für das geben, was du erreichen willst?Es ist sehr wahrscheinlich, dass es eine bessere Lösung gibt. Beachten Sie, dass beim Erstellen einer Instanz der äußeren Klasse * nicht * automatisch eine Instanz verschachtelter Klassen erstellt wird. –

+0

Sie können die Antwort hier finden https://msdn.microsoft.com/en-us/library/ms173120.aspx –

+1

Sie können eine Dictionary-Klasse verwenden, anstatt 6 Klassen zu erstellen, die denselben Zweck haben, einige Werte zu speichern –

Antwort

7

Sie vermischt Definition und Erklärung. Beim Definieren einer geschachtelten Klasse wird keine Instanz erstellt. Auch die von Ihnen definierten Klassen sehen so aus, als ob sie alle dieselben Eigenschaften verwenden. Sie sollten also eine Klasse definieren und mehrere Instanzen deklarieren.

Sie können dieses Problem beheben, mit:

C# 6,0

public class Info 
{ 
    public string tag { get; set; } 
    public string value { get; set; } 
    public string reference { get; set; } 

} 

public class StockChecklist 
{ 
    public Info qty1p1 { get; } = new Info { tag = "uniqueval23456", value = "", reference = "" }; 
    public Info qty1p2 { get; } = new Info { tag = "uniqueval3736", value = "", reference = "" }; 

    public Info qty2 { get; } = new Info { tag = "uniqueval97357", value = "", reference = "" }; 

    public Info qty3p1 { get; } = new Info { tag = "uniqueval88356", value = "", reference = "" }; 
    public Info qty3p2 { get; } = new Info { tag = "uniqueval62346", value = "", reference = "" }; 
    public Info qty3p3 { get; } = new Info { tag = "uniqueval09876", value = "", reference = "" }; 
    public Info qty3p4 { get; } = new Info { tag = "uniqueval62156", value = "", reference = "" }; 
    public Info qty4 { get; } = new Info { tag = "uniqueval25326", value = "", reference = "" }; 
} 

Pre C# 6.0 Sie die Instanzen im Konstruktor erstellen haben.

public class StockChecklist 
{ 

    public StockChecklist() 
    { 
     qty1p1 = new Info { tag = "uniqueval23456", value = "", reference = "" }; 
     qty1p2 = new Info { tag = "uniqueval3736", value = "", reference = "" }; 

     qty2 = new Info { tag = "uniqueval97357", value = "", reference = "" }; 

     qty3p1 = new Info { tag = "uniqueval88356", value = "", reference = "" }; 
     qty3p2 = new Info { tag = "uniqueval62346", value = "", reference = "" }; 
     qty3p3 = new Info { tag = "uniqueval09876", value = "", reference = "" }; 
     qty3p4 = new Info { tag = "uniqueval62156", value = "", reference = "" }; 
     qty4 = new Info { tag = "uniqueval25326", value = "", reference = "" }; 
    } 

    public Info qty1p1 { get; private set; } 
    public Info qty1p2 { get; private set; } 

    public Info qty2 { get; private set; } 

    public Info qty3p1 { get; private set; } 
    public Info qty3p2 { get; private set; } 
    public Info qty3p3 { get; private set; } 
    public Info qty3p4 { get; private set; } 
    public Info qty4 { get; private set; } 
} 

Anmerkung: Wie einige Kommentare bereits erwähnt, erklärt 8 Instanzen derselben Klasse innerhalb einer Klasse auf ‚schlecht‘ Design zeigen könnte. Sie könnten dafür eine Dictionary<> erstellen.


Hier ist eine Wörterbuch-Version: (Bonus)

public class Info 
{ 
    public string tag { get; set; } 
    public string value { get; set; } 
    public string reference { get; set; } 

} 

public class StockChecklist 
{ 
    private Dictionary<string, Info> _infoDict = new Dictionary<string, Info>(); 

    private void AddToDict(Info info) 
    { 
     _infoDict.Add(info.tag, info); 
    } 

    public StockChecklist2() 
    { 
     AddToDict(new Info { tag = "uniqueval23456", value = "", reference = "" }); 
     AddToDict(new Info { tag = "uniqueval3736", value = "", reference = "" }); 
     AddToDict(new Info { tag = "uniqueval97357", value = "", reference = "" }); 
     AddToDict(new Info { tag = "uniqueval88356", value = "", reference = "" }); 
     AddToDict(new Info { tag = "uniqueval62346", value = "", reference = "" }); 
     AddToDict(new Info { tag = "uniqueval09876", value = "", reference = "" }); 
     AddToDict(new Info { tag = "uniqueval62156", value = "", reference = "" }); 
     AddToDict(new Info { tag = "uniqueval25326", value = "", reference = "" }); 
    } 

    public bool TryGetByTag(string tag, out Info info) 
    { 
     return _infoDict.TryGetValue(tag, out info); 
    } 

    public Info this[string tag] 
    { 
     get 
     { 
      Info info; 

      if (!_infoDict.TryGetValue(tag, out info)) 
       return null; 

      return info; 
     } 
    } 
} 

verwenden Sie es wie: (C# 6,0)

StockChecklist stock = new StockChecklist(); 
Info info; 
if (stock.TryGetByTag("uniqueval23456", out info)) 
{ 
    Trace.WriteLine($"{info.tag} = {info.value}"); 
} 

Oder (C# 6.0)

Trace.WriteLine(stock["uniqueval88356"]?.value); 
+0

Ja, das scheint zu sein, wo ich falsch gelaufen bin . Ich musste nur eine separate Klasse deklarieren und dann diese Klasse verwenden, um Objekte in meiner anderen Klasse zu instanziieren. Ich dachte fälschlicherweise, dass verschachtelte Klassen irgendwie die Antwort auf den Zugriff auf Objekte innerhalb der Klasse – Lee

+0

sind. Ich lese gerade Ihr Update und den Unterschied zwischen den verschiedenen Versionen von C#. Das war mehr als ich jemals verlangen könnte. Vielen Dank! – Lee

+0

Ich wusste nicht, dass ich auch meine eigenen Typen mit Dictionary verwenden könnte! Wow Danke! Sieht so aus, als müsste ich noch viel genauer hinsehen. – Lee

0

Sie sollten etwas tun:

public class qty1p1 { public string tag = "uniqueval23456"; public string value = ""; public string reference = ""; } 
    public class qty1p2 { public string tag = "uniqueval3736"; public string value = ""; public string reference = ""; } 

    public class qty2 { public string tag = "uniqueval97357"; public string value = ""; public string reference = ""; } 

    public class qty3p1 { public string tag = "uniqueval88356"; public string value = ""; public string reference = ""; } 
    public class qty3p2 { public string tag = "uniqueval62346"; public string value = ""; public string reference = ""; } 
    public class qty3p3 { public string tag = "uniqueval09876"; public string value = ""; public string reference = ""; } 
    public class qty3p4 { public string tag = "uniqueval62156"; public string value = ""; public string reference = ""; } 

    public class qty4 { public string tag = "uniqueval25326"; public string value = ""; public string reference = ""; } 

public class StockChecklist 
{ 
    public qty1p1 _qty1p1; 
    public qty1p2 _qty1p2; 
. 
. 
. 
} 

und dann können Sie es mögen verwenden:

StockChecklist theCurrentList = new StockChecklist(); 
theCurrentList._qty1p1.tag = 'changedval999999999'; 
+1

Sie meinen wahrscheinlich "theCurrentList.qty1p1.tag", nicht wahr? Außerdem müssen Sie zuerst diese Eigenschaften in 'StockCheckList' instanziieren. – HimBromBeere

+0

Ja natürlich. Dies geschieht, wenn Sie Code aus der Frage kopieren. du vergisst es zu bearbeiten;) –

+0

Noch läuft in eine NRE als '_qty1p1' ist nicht instanziiert :) – HimBromBeere

-1

Sie können wie folgt tun:

public class Parent 
{ 

    public class child1 { public string name = "a"; public int Value = 1;} 
    public class child2 { public string name = "b"; public int Value = 2;} 
    public class child3 { public string name = "c"; public int Value = 3;} 
    public class child4 { public string name = "d"; public int Value = 4;} 
    public class child5 { public string name = "e"; public int Value = 5;} 
    public child1 c1; 
    public child2 c2; 
    public child3 c3; 
    public child4 c4; 
    public child5 c5; 
    public Parent() { 
     this.c1 = new child1(); 
     this.c2 = new child2(); 
     this.c3 = new child3(); 
     this.c4 = new child4(); 
     this.c5 = new child5(); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     Parent p1 = new Parent(); 
     Console.WriteLine(p1.c1.name); 
     Console.WriteLine(p1.c2.name); 
     Console.WriteLine(p1.c3.name); 
     Console.WriteLine(p1.c4.name); 
     Console.WriteLine(p1.c5.name); 
     Console.ReadLine(); 

    } 
Verwandte Themen