8

私は2つのクラスを持っています:

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

public class Human{int age; HumanProperties properties;}

ヒューマンの新しいインスタンスを作成したい場合は、やらなければなりませんが、その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 に答える