Link to nested class objects in C #

I want to have a class with several nested classes, so when I create a new parent class, an object of each nested class is created, and I can refer to the variables inside each nested class globally.

Here is my current 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 = "";  }

 } 

then I create a new parent object with:

  StockChecklist theCurrentList = new StockChecklist (); 

but how to access tags of nested objects', 'value' and 'reference'? I was hoping for something simple, like StockChecklist.qty1p1.tag = 'changedval999999999';

Is something like this possible with C #?

+5
source share
3 answers

You have mixed up the definition and the declaration . The definition of a nested class does not instantiate. Also, the classes you define look as if they all use the same properties. So you have to define one class and declare multiple instances.

You can fix this with:

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 you need to create instances in the constructor.

 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; } } 

Note. As noted earlier, declarations of 8 instances of the same class in a class may indicate a “bad” design. You can create a Dictionary<> for it.


Here is the dictionary 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; } } } 

Use it like: (C # 6.0)

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

Or (C # 6.0)

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

You should do something like this:

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

and then you can use it like:

 StockChecklist theCurrentList = new StockChecklist(); theCurrentList._qty1p1.tag = 'changedval999999999'; 
0
source

You can do the following:

 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(); } 
-1
source

Source: https://habr.com/ru/post/1245481/


All Articles