实例化所有子类以及父类

时间:2018-02-20 19:48:14

标签: c# asp.net .net

假设我有一个看起来像这样的课程:

    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。有没有办法将所有子类与父类一起实例化?

3 个答案:

答案 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