2013-03-04 3 views
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(); 
} 

Любые идеи?

ответ

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 объект пригоден для использования и populatable, без необходимости изменять Foo класс. Добавленный бонус: когда вы добавляете свойство для заполнения (скажем Prop3), вам нужно будет только изменить метод PopulateValues().

В вашем коде вы также должны это сделать, но тогда вам нужно будет также добавить назначение Prop3, которое, если будет забыто, вызовет ошибки.

3

Я согласен с @CodeCaster в том, что это, вероятно, должно быть сделано с модификацией конструктора, но просто для того, чтобы предоставить другую альтернативу - почему бы не сделать метод GetPopulatedValues принимающим экземпляр A и заполнить значения напрямую.

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

public void Init() 
{ 
    var obj = new B(); 
    GetPopulatedValues(obj); 
} 
Смежные вопросы