【问题标题】:Generating empty objects - empty class with empty properties/subclasses C#生成空对象 - 具有空属性/子类的空类 C#
【发布时间】:2013-02-10 06:33:42
【问题描述】:

我有两个班级:

public class HumanProperties { int prop1; int prop2; string name;}

public class Human{int age; HumanProperties properties;}

现在,如果我想创建 Human 的新实例,我必须这样做 Human person = new Human(); 但是当我尝试像person.properties.prop1=1; 一样访问时,我在属性处有 nullRefrence,因为我也必须创建新属性。 我必须这样做:

Human person = new Human();
person.properties = new HumanProperties();

现在我可以访问这个person.properties.prop1=1;

这是一个小例子,但我从 xsd 生成了巨大的类,我没有太多时间手动生成这个“人”类及其所有子类。 有什么方法可以通过编程方式完成,或者有一些生成器吗?

或者我可以遍历类并为每个属性创建新的类 typeof 属性并将其加入父类吗?

谢谢!

【问题讨论】:

  • 值得注意的是,您的类没有属性,它只有公共字段。它们可能应该是属性,但目前不是。

标签: c# empty-class


【解决方案1】:

我不认为有一种传统的方式来做你要求的事情,因为类的默认类型是null。但是,您可以使用反射以递归方式遍历属性,使用无参数构造函数查找公共属性并对其进行初始化。像这样的东西应该可以工作(未经测试):

void InitProperties(object obj)
{
    foreach (var prop in obj.GetType()
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Where(p => p.CanWrite))
    {
        var type = prop.PropertyType;
        var constr = type.GetConstructor(Type.EmptyTypes); //find paramless const
        if (type.IsClass && constr != null)
        {
            var propInst = Activator.CreateInstance(type);
            prop.SetValue(obj, propInst, null);
            InitProperties(propInst);
        }
    }
}

然后你可以这样使用:

var human = new Human();
InitProperties(human); 

【讨论】:

  • 谢谢!这正是我所需要的。
【解决方案2】:

我建议你使用构造函数:

public class Human
{
  public Human()
  {
     Properties = new HumanProperties();
  }

  public int Age {get; set;} 
  public HumanProperties Properties {get; set;}
}

【讨论】:

  • 这是问题中示例最明显的解决方案。但是,我认为 OP 要求初始化嵌套类属性的深层层次结构,而不仅仅是单个级别。想象一下HumanPropertiesInnerProperties,而那些有DetailedInnerProperties 等等。如果我正确理解了这个问题,OP 希望将所有这些初始化为“非空”,而不需要手动为它们中的每个创建一个new Instance()构造函数。
  • 在我看来——每个类都负责实例化自己的属性。而且我相信最好在该类的构造函数中完成。无论类层次结构或嵌套属性如何。
  • 我同意你的看法。但是,如果该类是为一般用途而设计的,您可能想要也可能不想初始化属性——也许最好将它们保留为null。如果这个用户有一个一次性用例,他想以这种方式初始化,我不会通过更改构造函数来向所有用户规定。
【解决方案3】:

您可以将您的类声明更改为:

public class Human
{
    int age;
    HumanProperties properties = new HumanProperties();
}

【讨论】:

    【解决方案4】:

    .NET 使用属性。

    您可以使用 Visual Studio 键盘快捷键:Ctrl+r、Ctrl+e 自动生成属性。

    试试这个:

    public class HumanProperties
    {
        public int Prop1
        {
            get { return _prop1; }
            set { _prop1 = value; }
        }
        private int _prop1 = 0;
    
        public int Prop2
        {
            get { return _prop2; }
            set { _prop2 = value; }
        }
        private int _prop2;
    
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        private string _name = String.Empty;
    }
    
    public class Human
    {
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        private int _age = 0;
    
        public HumanProperties Properties
        {
            get { return _properties; }
            set { _properties = value; }
        }
        private HumanProperties _properties = new HumanProperties();
    }
    

    【讨论】:

    • 既然可以使用自动属性,为什么还要像这样手动创建属性?
    • @Servy 如果您手动创建它们,您可以指定默认值。在这种情况下,您可以确保 HumanProperties _properties 不为空。
    • 您可以在构造函数中以更少的代码为自动属性执行此操作。
    猜你喜欢
    • 2013-01-15
    • 1970-01-01
    • 2021-10-29
    • 2021-12-20
    • 1970-01-01
    • 2011-06-03
    • 2014-07-15
    • 2015-10-01
    • 2019-05-05
    相关资源
    最近更新 更多