假设我有一个看起来像这样的课程:
private class CompanyPerson
{
public Person Person { get; set; }
public string UserTokenGuid { get; set; }
}
然后Person
看起来像这样:
private class Person
{
public Info Info { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
....
}
Info
...
private class Info
{
...
}
现在,如果我创建CompanyPerson
的实例:
CompanyPerson companyPerson = new CompanyPerson();
这一切都很好。但是,如果我立即尝试这个:
companyPerson.Person.FirstName = "Bob";
它会抛出错误,因为companyPerson.Person
不存在。我明白了,我理解为什么。但是,这是一个深层次的子类,其深度为8或9。有没有办法将所有子类与父类一起实例化?
答案 0 :(得分:3)
不,没有通用的方法来实例化“所有子对象”。
您可以反映所有属性以找到它们(包括递归遍历),但实际上通常不可能创建对象。
为什么:
IList<int> Foo {get; private set;}
)MyType SecondInArray {get;set;}
)在某些情况下,您可以使用依赖注入容器来实例化您感兴趣的类型(在使用反射查找所有属性之后)。但实际上没有比在构造函数中实际设置所有属性更好的了。
答案 1 :(得分:1)
您应该能够实例化每个嵌套成员的新实例,因为它们看起来像......
var companyPerson = new CompanyPerson
{
Person = new Person
{
Info = new Info
{
// Keep instantiating nested properties as they appear
},
FirstName = "Bob",
LastName = "Doe"
},
UserTokenGuid = "someValue"
};
它可以有点毛茸茸,但这是我能想到的最好方法,一次只能实例化一个嵌套对象。
我对此的体验来自构建深度嵌套的DTO模型,这些模型转换为Web服务的JSON对象。
答案 2 :(得分:0)
在单元测试期间,您所询问的是常见的。 我不知道这是否曾在生产中完成,无论如何你可以使用任何测试框架创建一个存根(即初始化你的类的虚拟实例,包括属性);我最喜欢的是NSubtitute,你必须这样做:
var APerson = Substitute.For<CompanyPerson>();
你应该好好去。 通过NuGet安装它:
Install-Package NSubstitute -Version 3.1.0