Не удается получить доступ к нестатическому члену из вложенного класса в C#

#c# #oop

#c# #ооп

Вопрос:

 namespace DateTimeExpress
{
    public class Today
    {
        private DateTime _CurrentDateTime;


        public class Month 
        {
            public int LastDayOfCurrentMonth
            {
                get
                {
                    return DateTime.DaysInMonth( _CurrentDateTime.Year, _CurrentDateTime.Month);
                }
            }
        }

        public Today()
        {

        }
    }
}
  

Как я могу получить доступ к _CurrentDateTime

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

1. Итак, что бы вы хотели new Today.Month().LastDayOfCurrentMonth оценить? Обратите внимание, что в нем не был создан ни один Today экземпляр, и в нем нет ни одного _CurrentDateTime поля для чтения.

Ответ №1:

Вы можете увидеть пример, объясняющий вашу проблему, в руководстве по программированию на C # в абзаце «Вложенные типы«, где говорится:

Вложенный или внутренний тип может получить доступ к содержащему или внешнему типу. Чтобы получить доступ к содержащему типу, передайте его как конструктор вложенному типу.

По сути, вам нужно передать ссылку на контейнер (класс Today) в конструкторе вложенного класса (класс Month)

 public class Today
{
    private DateTime _CurrentDateTime;
    private Month _month;

    public int LastDayOfCurrentMonth { get { return _month.LastDayOfCurrentMonth; }}

    // You can make this class private to avoid any direct interaction
    // from the external clients and mediate any functionality of this
    // class through properties of the Today class. 
    // Or you can declare a public property of type Month in the Today class
    private class Month
    {
        private Today _parent;
        public Month(Today parent)
        {
            _parent = parent;
        }
        public int LastDayOfCurrentMonth
        {
            get
            {
                return DateTime.DaysInMonth(_parent._CurrentDateTime.Year, _parent._CurrentDateTime.Month);
            }
        }
    }

    public Today()
    {
        _month = new Month(this);
        _CurrentDateTime = DateTime.Today;
    }
    public override string ToString()
    {
        return _CurrentDateTime.ToShortDateString();
    }
}
  

И вызовите его чем-то вроде этого

 Today y = new Today();
Console.WriteLine(y.ToString());
Console.WriteLine(y.LastDayOfCurrentMonth);