2

これらのような基本クラスと継承クラスの2つのクラスがあります

public class A
{
     public string Prop1 { get; set; }
} 

public class B : A
{
     public string Prop2 { get; set; }
} 

Aこれで、プロパティ値を入力した後にクラスを返すメソッドができました

public A GetPopulatedValues()
{
     //code to populate values here
}

今私の質問は、一度にすべてのプロパティ値を割り当てる方法ですか?

これは機能します

public void Init()
{
   var obj = new B();
   obj.Prop1 = GetPopulatedValues().Prop1;
}

しかし、私はこのようなものが欲しい

  public void Init()
{
   var obj = new B();
   obj = GetPopulatedValues();
}

何か案は?

4

2 に答える 2

5

コンストラクターを作成します。

public Foo(string prop1, string prop2)
{
    Prop1 = prop1;
    Prop2 = prop2;
}

またはコピー コンストラクター:

public Foo(Foo other)
{
    Prop1 = other.Prop1;
    Prop2 = other.Prop2;
}

または、オブジェクト初期化子を使用します。

var foo = new Foo { Prop1 = "Hello", Prop2 = "World" };

しかし、@RudiVisser が言うように、実際には、GetPopulatedValues()入力するオブジェクトへの参照を提供することにより、メソッドでこれを修正する必要があります。

static class FooPopulator
{
    public static void PopulateValues(Foo foo)
    {
        foo.Prop1 = "Hello";
        foo.Prop2 = "World";
    }
}

var foo = new Foo();
FooPopulator.PopulateValues(foo);

これで、クラスfooを変更しなくても、オブジェクトが使用および移入可能になります。Fooボーナスの追加: 設定するプロパティを追加すると (たとえばProp3)、PopulateValues()メソッドを変更するだけで済みます。

コードでもそれを行う必要がありますが、Prop3割り当ても追加する必要があり、忘れるとバグが発生します。

于 2013-03-04T12:19:01.477 に答える
3

これはおそらくコンストラクターの変更で行う必要があるという@CodeCasterに同意しますが、別の代替手段を提供するためだけに、GetPopulatedValuesメソッドに のインスタンスを受け入れさせA、値を直接入力しないでください。

public void GetPopulatedValues(A instance)
{
    instance.Prop1 = (whatever);
}

public void Init()
{
    var obj = new B();
    GetPopulatedValues(obj);
}
于 2013-03-04T12:21:11.350 に答える