#c#
#c#
Вопрос:
У меня есть два класса:
public class PageMeta
{
public PageMeta() { }
public string DataSource { get; set; }
public string TopicID { get; set; }
public string Title { get; set; }
}
public PersonViewModel()
{
PageMeta = new PageMeta
{
Title = "Test"
};
public PageMeta PageMeta { get; set; }
}
Для создания этих:
var r = new PersonViewModel();
r.PageMeta.DataSource="abc";
r.PageMeta.TopicID="def";
В реальной жизни мои классы сложнее, и это всего лишь пример. Что я хотел бы сделать, так это объединить создание PersonViewModel с настройкой источника данных и идентификатора темы.
var r = new PersonViewModel {
PageMeta.DataSource="abc";
PageMeta.TopicID="def";
}
Есть ли какой-либо способ, которым это можно было бы сделать на C #?
Комментарии:
1. Должен ли PersonViewModel() быть классом или методом?
Ответ №1:
ДА.
var r = new PersonViewModel {
PageMeta = {
DataSource = "abc",
TopicID = "def"
}
}
Комментарии:
1. @Slaks — Есть ли какой-нибудь способ, которым я мог бы сделать это без замены исходного ctor. Также по-прежнему возникает синтаксическая ошибка, связанная со строкой TopicID
2. Это не заменяет исходный ctor. Несмотря на то, что у него есть an
=
, он не заменяет существующийPageMeta
экземпляр. Это не дает мне никаких синтаксических ошибок.3. Извините за это. Теперь я вижу = Спасибо за вашу помощь.
Ответ №2:
Да, у вас может быть инициализатор объекта внутри другого инициализатора объекта:
var r = new PersonViewModel
{
PageMeta = { DataSource = "abc", TopicID = "def" }
};
Это работает, потому что ваш PersonViewModel
конструктор инициализируется PageMeta
новым экземпляром. Таким образом, это инициализирует поля PageMeta
свойства с использованием get
for PageMeta
.
Если вы не инициализируете новый экземпляр PageMeta
в своем конструкторе для PersonViewModel
(или если PageMeta
был a struct
, который возвращает копию, поэтому getter не будет работать), вы получите к нему доступ через PageMeta
установщик:
var r = new PersonViewModel
{
PageMeta = new PageMeta { DataSource = "abc", TopicID = "def" }
};