Domanda

Ho creato una strega di classe che contiene un elenco tipizzato e deriva da un'altra classe che ho creato. Questo appare come segue:

namespace MyIntegretyCheck.Common
{
    /// <summary>
    /// Description of PolicyErrors.
    /// </summary>
    public partial class PolicyErrorEndingDates
    {
        public int ID_P {get;set;}
        public DateTime DT_S_E {get;set;}
        public DateTime DT_SC_E {get;set;}

        public List<PolicyErrorDescr> Errors {get;set;}
    }

    public partial class PolicyErrorDescr
    {
        public string Field1{get;set;}
        public string Field2 {get;set;}
        public string F1IsThanF2 {get;set;}
        public string Message {get;set;}
        public int ErrorLevel {get;set;} //0= Info | 1= Warning | 2= Error

    }
}

Ora ho creato un elenco digitato di PolicyErrorEndingDates, ho aggiunto una voce e ho provato quindi ad aggiungere le voci del suo elenco nidificato Errori come segue:

public List<PolicyErrorEndingDates> MyPolicyEndingDates()
{

    DAL.PolicyEndingDates ped = new DAL.PolicyEndingDates();
    List<PolicyErrorEndingDates> MyErrors = new List<PolicyErrorEndingDates>();

    foreach(var m in ped.CheckTables())
    {
        bool HasError = false;
        PolicyErrorEndingDates p = new PolicyErrorEndingDates();
        p.ID_P = m.ID_P;

        if(m.DT_S_E != m.DT_SC_E)
        {
            PolicyErrorDescr e = new PolicyErrorDescr();
            HasError = true;
            e.Field1 = "DT_S_E";
            e.Field2 = "DT_SC_E";
            e.Message = "blablabla...";
            e.ErrorLevel = 3;
            p.Errors.Add(e);
        }

        if(HasError)
            MyErrors.Add(p);
    }
}

Il debugger si è arrestato in modo anomalo con il messaggio Object reference not set to an instance of an object, nella riga p.Errors.Add(e); all'interno del mio if. Cosa ho fatto di sbagliato? Come posso creare un'istanza dell'elenco nidificato?

È stato utile?

Soluzione

Hai assegnato un'istanza List<PolicyErrorDescr> alla proprietà Errori?

In primo luogo, probabilmente renderei la Errors raccolta di sola lettura dall'esterno, ovvero l'elenco può essere modificato, ma non puoi dargli un nuovo elenco.

Questo lo farei rendendo privato il setter:

public List<PolicyErrorDescr> Errors { get; private set; }
                                            ^-----^
                                              this

Quindi vorrei creare un costruttore e assegnare un'istanza di raccolta a quella proprietà da essa:

public PolicyErrorEndingDates()
{
    Errors = new List<PolicyErrorDescr>();
}

Questo dovrebbe occuparsi dell'eccezione di riferimento null.

Altri suggerimenti

Suppongo, poiché p è una nuova istanza, l'elenco Errori non è stato istanziato (come quello che ha detto Lasse).

e.ErrorLevel = 3;
p.Errors = new List<PolicyErrorDescr>(); //add this
p.Errors.Add(e);

Non inizializzi mai l'elenco Errori in PolicyErrorEndingDates

se correggi come segue:

public partial class PolicyErrorEndingDates
    {
        public int ID_P {get;set;}
        public DateTime DT_S_E {get;set;}
        public DateTime DT_SC_E {get;set;}

        public List<PolicyErrorDescr> Errors {get;set;}
        public PolicyErrorEndingDates()
        {
            Errors = new List<PolicyErrorDescr>()
        }
    }

p.Errors è null

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top