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