Необходим ярлык конструктора C #

#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" }           
       };