处理类中的空子对象

本文关键字:对象 处理 | 更新日期: 2023-09-27 18:02:17

我有几个类

public class Person
{
   public int Id{get;set;}
   public string Name{get;set;}
   public virtual Institution Institution{get; set;}    
}
public class Institution
{
    public int Id{get;set;}
    public string Name{get;set;}
    public virtual InstitutionType InstitutionType { get; set; }
}
public class InstitutionType
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
    public virtual ICollection<Institution> Institutions { get; set; }
}

这个类是一个代码优先的模型,它使用实体框架从数据库中的表中提取记录。通常会出现Institution表中没有Institution type的情况。

当我使用下面的代码,没有机构类型数据的记录,我得到一个空引用异常。

cm.InstitutionTypeId = person.Institution.InstitutionType == null ? 0 : contact.Institution.InstitutionType.Id;

这些情况应该如何处理?我的课程应该重新设计吗?

处理类中的空子对象

(编辑显示延迟加载代码示例)

目前,在使用可能为null的对象的属性之前,没有办法检查null引用。

cm.InstitutionTypeId = (person.Insitituion != null && person.Institution.InstitutionType != null) ? contact.Institution.InstitutionType.Id : 0;

c#目前还没有一个安全的导航操作符,但是根据这个:

http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx

我们可能很快就会得到一个:"?"

或者,你可以让你的Institution属性延迟加载一个新的Institution实例,该实例初始化为一个ID为0的Institution type。根据使用这些对象时所需的业务逻辑,这可能是也可能不是最好的方法。由于这些都是实体对象,因此您需要确保理解创建新实例的数据含义,而不是设置对现有默认Institution或InstitutionType的引用。希望对你有帮助。

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    private Institution _Institution;
    public Institution Institution
    {
        get { return _Institution ?? (_Institution = new Institution()); }
    }
}
public class Institution
{
    public int Id { get; set; }
    public string Name { get; set; }
    private InstitutionType _InstitutionType;
    public InstitutionType InstitutionType
    {
        get { return _InstitutionType ?? (_InstitutionType = new InstitutionType() { Id = 0 }); }
    }
}

通常,您必须问自己:如果数据不存在,您将无法做什么,您想做什么?

在您的示例中,如果person为空,您将无法执行任何操作。事实上,如果person为null,您的代码可能永远都不应该被输入,所以这是一个很好的地方,可以抛出ArgumentNullException或类似的东西。

如果person.Institution为空,您将无法对机构进行任何操作。您将不得不跳过所有与机构相关的代码,但是您可能希望也可能不希望抛出异常。可能不会。

如果缺少person.Institution.InstitutionType,则不能对机构类型做任何操作,但您可能会提出默认值。您可能希望将空InstitutionType视为与ID=0, Name=String的InstitutionType相同。