Создать общий метод для инициализации (любого) объекта

127
15

У меня есть класс с именем A а внутри класса A есть много других определяемых пользователем свойств объекта (B, C и т.д.). Для использования класса A мне нужно создать экземпляр как

new A{ B = new B(), C = new C() ...}

Этот сценарий случается много раз в моем проекте, и это делает мой код немного неопрятным.

Теперь мне нужен какой-то код (или существующая библиотека, фреймворк) для создания экземпляра такого класса, используя меньше кода.

спросил(а) 2021-01-14T01:49:30+03:00 1 неделя назад
1
Решение
62

Хорошо, давайте использовать Reflection, я создал BaseClass, и похоже,

public class Base {

public Base() {
Type type = this.GetType(); // gets current type
var props = type.GetProperties(); // get current type properties

foreach (var item in props) // B and C
{
object instance = Activator.CreateInstance(item.PropertyType); // create instace of both B and C
item.SetValue(this, instance); // set B property to new value which we have created instance

}

}
}

И наш контейнерный класс, который является A, должен быть получен из BaseClass и должен использовать базовый конструктор,

public class A : Base 
{
public A() : base() {

}
public B _B { get; set; }
public C _C {get;set;}
}

После выполнения этого, просто создайте instace из A и проверьте свойства,

Надежда помогает,

ответил(а) 2021-01-14T01:49:30+03:00 1 неделя назад
43

Это то, что (конструктор, метод) Перегрузка есть для :) См. Ниже пример:

public class ClassA {

public ClassA() {
// Do some generic initialization here
this.ClassB = new ClassB();
this.ClassC = new ClassC();
}

// Always call the base constructor using : this()
public ClassA(string name, int age) : this() {
this.Name = name;
this.Age = age;
}

// chain to another, 'simpler' constructor by doing : this(name, age)
public ClassA(string name, int age, ClassB classB) : this(name, age) {
this.ClassB = classB;
}

public ClassA(string name, int age, ClassB classV, ClassC classC) : this(name, age, classV) {
this.ClassC = classC;
}
public string Name { get; set; }
public int Age { get; set; }
public ClassB ClassB { get; set; }
public ClassC ClassC { get; set; }
}

public class ClassB {
public string School { get; set; }
public string Class { get; set; }
}

public class ClassC {
public string Area { get; set; }
public string Suburb { get; set; }
}

и затем назовите его следующим образом:

public SomeMethod() {
ClassA = new ClassA("John", 40, new ClassB(), new ClassC());
}

Вы действительно можете сделать инициализацию типа намного проще, перегружая конструкторы

ответил(а) 2021-01-14T01:49:30+03:00 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема