C # aninhados digitado listas
-
22-07-2019 - |
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?
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