使用List.Add <t>时的NullReference异常,想了解它

时间:2015-08-10 07:38:22

标签: c# nullreferenceexception

我有一个类似于以下内容的设置类:

/// <summary>
/// Class for pipeline settings
/// </summary>
public class PipelineSettings
{
    /// <summary>
    /// List of jobs to process
    /// </summary>
    [JsonProperty("jobs")]
    public List<PipelineJob> Jobs;

    // todo: make private and create FetchCredentials(id)
    /// <summary>
    /// List of credentials information cataloged by id
    /// </summary>
    [JsonProperty("credentials")]
    public List<PipelineCredentials> Credentials;


}

以及如下所示的凭据类:

/// <summary>
/// Class to hold credentials for pipeline jobs
/// </summary>
public class PipelineCredentials
{
    /// <summary>
    ///  The id for the current credential  to be used when referring to it within
    ///  other areas of json settings files
    /// </summary>
    [JsonProperty("id")]
    public int Id;

    /// <summary>
    /// Username or login string for the current system
    /// </summary>
    [JsonProperty("username")]
    public string Username;

    // refine: AES auto encrypt?
    /// <summary>
    /// The password for the active authentication. If not encrypted then it
    /// will be automatically converted into an AES encrypted string
    /// </summary>
    [JsonProperty("password")]
    public string Password;

    [JsonProperty("path")]
    public string UNCPath;
}

我已经构建了以下内容以尝试将新凭据添加到我的列表中:

var settings = new PipelineSettings();

// Build credentials for storage
var credentials = new PipelineCredentials();
credentials.Id = 1;
credentials.Username = "testUsername";
credentials.Password = "test_password";
credentials.UNCPath = null;

// Add credentials to the current settings class
settings.Credentials.Add(credentials);

var json = new JsonSerializeHelper();

Console.Write(json.Serialize(settings));

Console.ReadKey();

当我这样做时,我在下一行收到空引用异常:

settings.Credentials.Add(credentials);

我不知道我不知道的是 - 如果他们已经预先建好了,我应该如何将新项目添加到列表中?

2 个答案:

答案 0 :(得分:3)

看起来您需要实例化Credentials列表。

settings.Credentials = new List<PipelineCredentials>

代码中的某个地方。或者,为了保持整洁,您可以在构造函数中执行此操作:

/// <summary>
/// Class for pipeline settings
/// </summary>
public class PipelineSettings
{
    public PipelineSettings()
    {
        this.Credentials = new List<PipelineCredentials>();
    }

    /// <summary>
    /// List of jobs to process
    /// </summary>
    [JsonProperty("jobs")]
    public List<PipelineJob> Jobs;

    // todo: make private and create FetchCredentials(id)
    /// <summary>
    /// List of credentials information cataloged by id
    /// </summary>
    [JsonProperty("credentials")]
    public List<PipelineCredentials> Credentials;
}

这样,只要实例化一个新的PipelineSettings类,它就会自动创建一个PipelineCredentials列表。

答案 1 :(得分:1)

您的Credentials列表未初始化,您可以在构造函数中执行此操作:

public class PipelineSettings
{
    /// <summary>
    /// List of jobs to process
    /// </summary>
    [JsonProperty("jobs")]
    public List<PipelineJob> Jobs;

    // todo: make private and create FetchCredentials(id)
    /// <summary>
    /// List of credentials information cataloged by id
    /// </summary>
    [JsonProperty("credentials")]
    public List<PipelineCredentials> Credentials;

    public PipelineSettings()
    {  
        Credentials = new List<PipelineCredentials>();
    }
}