初始化嵌套对象属性

jho*_*ith 9 c#

我有一个名为employee的类,它有一个名为insurance的字段,类似于此类型的保险

public class Employee
{
    public string Name;
    public Insurance Insurance;
}
Run Code Online (Sandbox Code Playgroud)

我有另一个名为保险的班级

public class Insurance
{
    public int PolicyId;
    public String PolicyName;
} 
Run Code Online (Sandbox Code Playgroud)

现在在主程序中我想做类似的事情

var myEmployee = new Employee();
myEmployee.Name = "Jhon";
myEmployee.Insurance.PolicyId = 123 ;
myEmployee.Insurance.PolicyName = "Life Time" ;
Run Code Online (Sandbox Code Playgroud)

C#抱怨,我知道如何通过创建Insurance类的实例来修复它.

我的问题是我可以以某种方式为我想在主程序中使用的方式分配字段的值

**

myEmployee.Insurance.PolicyId = 123 ;
myEmployee.Insurance.PolicyName = "Life Time" ;
Run Code Online (Sandbox Code Playgroud)

**我试过了

 public class Employee
    {

        public Employee()
        {
            Insurance Insurance = new Insurance();
        }

        public String Name;
        public Insurance Insurance;



        public class Insurance
        {
            public int PolicyId;
            public String PolicyName;
        } 
    }
Run Code Online (Sandbox Code Playgroud)

在我尝试的主要方法

class Program
    {
        static void Main(string[] args)
        {
            var joe = new Employee();
            joe.Name = "Joe";
            joe.Insurance.

        }
Run Code Online (Sandbox Code Playgroud)

我得到这个错误 -

错误2"ConsoleApplication1.Employee.Insurance"和"ConsoleApplication1.Employee.Insurance"之间的歧义c:\ users\lenovo\documents\visual studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 15 17 ConsoleApplication1

bla*_*and 12

您可以在Employee的构造函数中实例化Insurance,这样就可以自动完成.您可以提供默认值,以确保在以后访问时尚未将其定义为有效.

public class Employee
{
    Insurance Insurance { get; set; }

    public Employee()
    {
        this.Insurance = new Insurance() { PolicyId = -1 };
    }
}

public class Insurance
{
    public int PolicyId { get; set; }
    public string PolicyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

或者保持嵌套的类:

public class Employee
{
    Insurance InsurancePolicy { get; set; }

    public Employee()
    {
        this.InsurancePolicy = new Insurance() { PolicyId = -1 };
    }
    public class Insurance
    {
        public int PolicyId { get; set; }
        public string PolicyName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)


Cᴏʀ*_*ᴏʀʏ 11

无需更改Employee类,可以使用对象初始值设定项:

var myEmployee = new Employee 
{
    Name = "Jhon",
    Insurance = new Insurance
    {
        PolicyId = 123,
        PolicyName = "Life Time"
    }
};
Run Code Online (Sandbox Code Playgroud)

或者,也许最好,您可以让EmployeeInsurance在其构造函数中创建一个新实例(如在其他答案中),或者另一个选项是在Insurance属性getter本身中执行它,因此仅在您使用时才实例化它它.以下是后者的一个例子:

class Employee 
{
    private Insurance insurance;

    public Insurance Insurance
    {
        get
        {
            if (insurance == null)
            {
                insurance = new Insurance();
            }
            return insurance;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我建议您不要构建具有所有公共字段的类,除非您确实知道这是您想要的.相反,我会考虑在字段上使用属性.我已将其他建议纳入以下代码中,并提供了我自己的建议:

public class Employee
{
    public Employee() 
    {
        this.Insurance = new Insurance();
    }

    // Perhaps another constructor for the name?
    public Employee(string name)
        : this()
    {
        this.Name = name;
    }

    public string Name { get; set; }
    public Insurance Insurance { get; private set; }
}

public class Insurance
{
    public int PolicyId { get; set; }
    public string PolicyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)


Kap*_*aG3 6

当然,但你如何分配属于某个null对象的东西呢?你需要InsuranceEmployee构造函数中实例化.

public Employee()
{
     this.Insurance = new Insurance();
}
Run Code Online (Sandbox Code Playgroud)

编辑关于你的评论:按照这一办法,你能够访问myEmplyee.Insurance.PolicyID两个点.构造函数位于 Employee的类中,因此一旦实现它,您就不必输入任何比您已经尝试过的更多的东西.