2016-03-21 3 views
5

Я хочу иметь класс с несколькими вложенными классами, так что когда я создаю новый родительский класс, создается объект каждого вложенного класса, и я могу ссылаться на переменные внутри каждого вложенного класса глобально.Ссылка на вложенные объекты класса в C#

Вот мой текущий код:

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

}

затем создать новый родительский объект с:

StockChecklist theCurrentList = new StockChecklist();

но как доступ к вложенным объектов «тег», «значение» и «ссылка «? Я надеялся на что-то простое, например StockChecklist.qty1p1.tag = 'changedval999999999';

Возможно ли это с C#?

+1

Это очень неясно * почему * у вас есть все эти загадочно-и-нетрадиционно названные вложенные классы. Можете ли вы дать больше контекста тому, чего вы пытаетесь достичь?Очень вероятно, что есть лучшее решение. Обратите внимание, что создание экземпляра внешнего класса делает * not * автоматически создавать экземпляр любых вложенных классов. –

+0

Здесь вы можете найти ответ https://msdn.microsoft.com/en-us/library/ms173120.aspx –

+1

Вы можете использовать класс Dictionary вместо создания 6 классов, которые имеют ту же цель, что и для хранения некоторых значений –

ответ

7

Вы перепутали определение и декларации. Определение вложенного класса не создает экземпляр. Также классы, которые вы определяете, выглядят так, как будто все они используют одни и те же свойства. Итак, вы должны определить один класс и объявить несколько экземпляров.

Вы можете исправить это:

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 вы должны создать экземпляры в конструкторе.

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

Примечание: Как и некоторые комментарии уже отмечалось, объявляя 8 экземпляров одного и того же класса в классе может указывать на «плохой» дизайн. Вы можете создать для него Dictionary<>.


Вот версия словаря: (бонус)

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

использовать его как: (C# 6,0)

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

Или (C# 6.0)

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

Да, это похоже на то, где я ошибся , Мне просто нужно было объявить отдельный класс, а затем использовать этот класс для создания объектов в моем другом классе. Я ошибочно считал, что вложенные классы каким-то образом отвечают на доступ к объектам в классе – Lee

+0

Я просто прочитал ваше обновление и разницу между различными версиями C#. Это было больше, чем я мог просить. Большое спасибо! – Lee

+0

Я не понимал, что могу использовать свои собственные пользовательские типы с помощью Словаря! Вау, спасибо! Похоже на что-то, что мне нужно будет изучить намного больше. – Lee

0

Вы должны сделать что-то вроде этого:

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

и тогда вы можете использовать его как:

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

Вы, вероятно, имеете в виду 'theCurrentList.qty1p1.tag', не ваш? Кроме того, вам нужно сначала создать эти свойства в 'StockCheckList'. – HimBromBeere

+0

Да, конечно. Это то, что происходит, когда вы копируете код из вопроса. вы забыли его отредактировать;) –

+0

По-прежнему работает в NRE, поскольку '_qty1p1' не обновлен :) – HimBromBeere

-1

Вы можете сделать так:

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

    } 
Смежные вопросы