8

我有两节课:

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 属性并将其加入父类吗?

谢谢!

4

4 回答 4

8

我不认为有一种传统的方式来做你所要求的,因为类的默认类型是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); 
于 2013-02-25T07:13:15.703 回答
5

我建议你使用构造函数:

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

  public int Age {get; set;} 
  public HumanProperties Properties {get; set;}
}
于 2013-02-25T06:54:49.387 回答
1

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

public class Human
{
    int age;
    HumanProperties properties = new HumanProperties();
}
于 2013-02-25T06:48:59.100 回答
0

.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();
}
于 2013-02-25T07:01:31.577 回答