Как вернуть объект при закрытии формы

#c#

Вопрос:

Я хочу вернуть объект типа Period , когда моя диалоговая форма (приложение Windows form) закроется.

Я знаю, что вы можете создавать простые свойства string int или что-то подобное, к которым можно получить доступ, form.property когда появится результат OK . Дело в том , что Period состоит из а List , двух DateTime , а string и трех decimal свойств.

Если я попытаюсь создать Period свойство, я получу сообщение об ошибке CS0053 Inconsistent accessibility: property type 'Period' is less accessible than property 'NewPeriod.Period' . Но я на самом деле не верю, что мне нужно возвращать этот объект по частям и создавать свойство для каждого отдельного свойства Period .

Также при попытке создать List<Entry> свойство я получаю ту же CS0053 ошибку, хотя и с Entry вместо Period . Entry состоит из четырех string , одного double и одного DateTime объекта недвижимости.

Вот моя сокращенная диалоговая форма:

 public partial class NewPeriod : Form
    {
        public Period Period { get; set; }

        private void btn_ok_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("OK");
            Period = behind.AddPeriod(dtp_begin.Value, dtp_end.Value, num_invoiceAmount.Value);
        }
    }
 

Это Period класс модели:

 class Period
    {
        public List<Entry> Entries { get; set; }
        public DateTime Begin { get; set; }
        public DateTime End { get; set; }
        public string Name { get; set; }
        public decimal ServerInvoiceAmount { get; set; }
        public decimal SplitCostAmount { get; set; }
        public decimal DonationAmount { get; set; }
    }
 

Я хочу использовать результат таким образом:

 var newPeriodForm = new NewPeriod();
var result = newPeriodForm.ShowDialog();
if(result == DialogResult.OK)
{
    periods.Add(newPeriodForm.Period);
}
 

Это первый раз, когда я пишу что-то на C# полностью самостоятельно, и я не смог найти ничего, кроме возврата простых свойств во время исследования.

Комментарии:

1. «Я хочу использовать результат таким образом». Есть ли причина, по которой вы не можете использовать результат таким образом? Я имею в виду, это должно сработать.

2. @LasseV.Karlsen да, как я уже писал, я получаю сообщение об ошибке. Но, как отметил Кай Джард, мой Period класс не является публичным

Ответ №1:

Посмотрите, где вы написали

 class Period
 

Напишите это вместо этого:

 public class Period
 

Опущение слова «общедоступный» означает, что по умолчанию он имеет значение «внутренний», что, в свою очередь, означает, что вы не можете сделать из него общедоступное свойство, потому что «внутренний» не такой «широко видимый» уровень доступа, как «общедоступный». Вы можете понизить доступность (сделать что — то «менее заметным»), Но вы не можете обновить его-если бы класс был общедоступным, ваша собственность могла бы быть внутренней, защищенной, частной и т. Д., Но не наоборот.

Как новый разработчик, если вы не уверены, что добавить, просто сделайте все свои классы общедоступными. В конце концов вы начнете использовать другие уровни доступа (в разных местах), когда возникнут ситуации, когда вам понадобится это средство, но прямо сейчас я бы сказал, что избавьте себя от головной боли, связанной с тайными сообщениями компилятора, и используйте public для классов и свойств, а private для полей

Комментарии:

1. Спасибо! Я полностью проигнорировал тот факт, что классы public/private/и т. Д… Я родом из java, и там все классы по умолчанию являются общедоступными, если вы создадите новый.

2. О … Я думал, что java чем-то похожа на C# (закрытый пакет, который похож на внутренний C#).. Добро пожаловать в C#!

3. это похоже на java, вам просто не нужно думать об этом, потому что ваша среда разработки автоматически делает класс общедоступным. Спасибо!