Jak vytvořit instanci a používat třídy se seznamem tříd?

hlasů
1

I mají strukturu datové sady tak, že projekt obsahuje více pracovních míst, a obsahuje každý Job více WorkItems. Vytvořil jsem tyto tři třídy:

public class WorkItemForRollup
{
    public Guid JobID { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public DateTime ScheduledDate { get; set; }
}

public class JobForRollup
{
    public Guid JobID { get; set; }
    public string JobName { get; set; }
    public decimal Price { get; set; }
    public DateTime ScheduledStart { get; set; }
    public List<WorkItemForRollup> WorkItems { get; set; }
}

public class ProjectRollup
{
    public decimal Total { get; set; }
    public List<JobForRollup> Jobs { get; set; }
}

Může mi někdo prosím, řekněte mi syntaxe pro spouštění této věci a následně přiřazením hodnoty na členy třídy? Tady je to, co jsem se snaží dostat do práce:

    ProjectRollup projectRollup = new ProjectRollup() { Jobs = new List<JobForRollup>() };
    JobForRollup jobsForRollup = new JobForRollup() { WorkItems = new List<WorkItemForRollup>() };

I pak může udělat projectRollup.Jobs.Add(job);, pokud ‚práce‘ je JobForRollup entita, ale nemohu přijít na to, jak přidat své WorkItems do každé pracovní místo.

Můžete mi prosím pomoct, nebo mi ukázat jiný způsob, který funguje? Děkuji!

Položena 20/10/2018 v 12:59
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
1

Chcete-li mít váš seznam inicializaci můžete psát své třídy v této cestě

public class WorkItemForRollup
{
    public Guid JobID { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public DateTime ScheduledDate { get; set; }
}

public class JobForRollup
{
    public Guid JobID { get; set; }
    public string JobName { get; set; }
    public decimal Price { get; set; }
    public DateTime ScheduledStart { get; set; }
    public List<WorkItemForRollup> WorkItems { get; set; } = new List<WorkItemForRollup();
}

public class ProjectRollup
{
    public decimal Total { get; set; }
    public List<JobForRollup> Jobs { get; set; } = new List<JobForRollup>();
}

Nyní máte všechny vaše nemovitost Seznam automaticky inicializovat pokaždé, když vybudovat nové instance těchto tříd. Tato syntaxe se nazývá inicializace Auto-Provedeno vlastnosti a je k dispozici od C # 6.0

Nyní, seznam vlastností, které mají přijímat položky vhodného typu, jsou správně inicializován, ale samozřejmě, že jsou prázdné.
Chcete-li přidat položky do WorkItems uvnitř třídy JobForRollup je nutné vytvořit instanci WorkItemForRollup a přidejte ji k instanci JobForRollup

ProjectRollup projectRollup = new ProjectRollup();
JobForRollup job = new JobForRollup();
job.WorkItems.Add(Get_A_WorkItem_Instance_From_Your_Code());
projectRollup.Jobs.Add(job);

// As an example
private WorkItemForRollup Get_A_WorkItem_Instance_From_Your_Code()
{
     WorkItemForRollup item = new WorkItemForRollup
     {
          Description="Description",
          Price = 42.42m,
          ScheduledDate = DateTime.Now.AddDays(30);
     };
     return item;
}
Odpovězeno 20/10/2018 v 13:10
zdroj uživatelem

hlasů
1

Ve skutečnosti to není dobrý přístup k instance tento Núrovňově vnořené typy, ale pod kód je ukázka:

ProjectRollup projectRollup = new ProjectRollup()
{
    Jobs = new List<JobForRollup>()
    {
        new JobForRollup()
        {
            JobID = Guid.NewGuid(),
            JobName = "job1",
            Price = 434,
            ScheduledStart = DateTime.Now,
            WorkItems = new List<WorkItemForRollup>()
            {
                new WorkItemForRollup()
                {
                    Description="item1",
                    Price = 34,
                    ScheduledDate = DateTime.Now
                }
            }
        }
    }
};

Ty by měly attachkaždý vnořené objekty a sbírku dohromady.

popsat svůj problém a vysvětlit, proč nejste s použitím ORM to, jako EntityFramework, nhibernateatd?

Odpovězeno 20/10/2018 v 13:07
zdroj uživatelem

hlasů
0

Inicializace vnořené kolekce je vždy trochu otravné věci. Ale jak jste již mají vlastnosti, která je natolik jednoduchý, aby dělat. Jen přestat používat auto-implementovat vlastnosti a napsat svůj vlastní ten, který vypadá takto:

private List<JobForRollup> _Jobs;

public List<JobForRollup> Jobs {
  get{
    if (_Jobs == null)
      _Jobs = new List<JobForRollup>();
    return _Jobs;
  }
  set{
    _Jobs=value;
  }
}

Největší nebezpečí při psaní vlastního kódu nemovitosti náhodně s podkladovou pole přistupovat pomocí jiného kódu třídy. Ale přidáním podtržítko jako předponu se prooven dostatečně spolehlivé pro použití ve všech příklad kódu Microsoft.

Odpovězeno 20/10/2018 v 13:06
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more