Pergunta

Eu criei uma bruxa classe contém uma lista digitada e deriva para outra classe que eu criei. Isso parece como se 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

    }
}

Agora, eu criei uma lista datilografada de PolicyErrorEndingDates, acrescentou uma entrada e tentou, em seguida, adicionar entradas de seus lista aninhada erros da seguinte forma:

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

O depurador colidiu com o Object reference not set to an instance of an object mensagem, na p.Errors.Add(e); linha dentro da minha if. O que eu fiz errado? Como posso criar uma instância da lista aninhada?

Foi útil?

Solução

Será que você atribui uma instância List<PolicyErrorDescr> à propriedade Erros?

Em primeiro lugar, eu provavelmente iria fazer a coleta Errors somente leitura do lado de fora, ou seja, a lista pode ser alterada, mas você não pode dar-lhe uma nova lista.

Isso eu faria, fazendo o setter privada:

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

Em seguida, eu iria criar um construtor e atribuir uma instância de coleção para que a propriedade dele:

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

Isso deve cuidar da exceção de referência nula.

Outras dicas

Meu palpite, já que p é um novo exemplo, a lista de erros não foi instanciado (como o que Lasse mencionado).

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

Você nunca inicializar a lista de erros na PolicyErrorEndingDates

Se você corrigir o seguinte:

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 é nulo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top