una tipo requiere referencia qué propiedad por pasar parametros para objetos objeto método metodos instancia estáticos establecida como clases campo c# string class nested

tipo - se requiere una referencia de objeto para el campo método o propiedad no estáticos c#



Hacer referencia a objetos de clase anidados en C# (3)

Quiero tener una clase con varias clases anidadas, de modo que cuando creo una nueva clase padre, se cree un objeto de cada clase anidada y pueda hacer referencia a las variables dentro de cada clase anidada globalmente.

Aquí está mi código actual:

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

luego creo un nuevo objeto padre con:

StockChecklist theCurrentList = new StockChecklist();

pero, ¿cómo acceder a los objetos anidados ''tag'', ''value'' y ''reference''? Esperaba algo simple como StockChecklist.qty1p1.tag = ''changedval999999999'';

¿Es posible algo así con C #?


Deberías hacer algo como esto:

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

y luego puedes usarlo como:

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


Puedes hacer esto:

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


Usted confundió definición y declaración . La definición de una clase anidada no crea una instancia. Además, las clases que defines parecen que todas usan las mismas propiedades. Por lo tanto, debe definir una clase y declarar instancias múltiples.

Puedes arreglar esto con:

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 tienes que crear las instancias en el 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; } }

nota: Al igual que algunos comentarios ya mencionados, declarar 8 instancias de la misma clase dentro de una clase podría apuntar a un diseño "deficiente". Podría crear un Dictionary<> para ello.

Aquí hay una versión del diccionario: (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; } } }

Úselo como: (C # 6.0)

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

O (C # 6.0)

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