Методы расширения C # в качестве значения элемента управления по умолчанию приводят к ошибке в окне дизайна - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь использовать метод расширения, чтобы инициализировать элемент управления datetimepicker на предыдущий рабочий день с сегодняшнего дня. Однако это вызывает мое окно дизайна формы, чтобы показать ошибку, поскольку это не может найти метод расширения.

Вы можете быстро повторить эту ошибку, создав новую форму окна, добавив указатель даты и времени. Затем создайте следующий новый класс для расширения DateTime и добавления метода NextDay ():

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ExtensionMethodDesignWindowTest
{
    public static class DateTimeExtensions
    {
        public static DateTime NextDay(this DateTime date)
        {
            return date.AddDays(1);
        }
    }
}

И, наконец, в Form1.designer.cs добавить строку

this.dateTimePicker1.Value = DateTime.Today.NextDay();

в разделе datetimepicker1. (редактировать: а также используя.system; вверху)

Когда вы вернетесь обратно в окно дизайна формы, вы должны увидеть ошибку. Обратите внимание, что этот код работает нормально и работает правильно, а указатель даты и времени показывает завтрашнюю дату при загрузке формы. Также, если вы замените добавленную строку в Form1.designer.cs на

this.dateTimePicker1.Value = DateTime.Today.AddDays(1);

Тогда вы не получите ошибку в окне дизайна. Это заставляет меня предположить, что ошибка в том, что окно дизайна формы Windows не может видеть пространство имен ExtensionMethodDesignWindowTest.

Как сделать так, чтобы окно дизайна формы могло видеть мои методы расширения?

Спасибо Dan

кстати, хотя я сомневаюсь, что это имеет значение, вот некоторая информация о версии IDE для того, что я использую: Microsoft Visual Studio 2010 Версия 10.0.30319.1 RTMRel Microsoft .NET Framework Версия 4.0.30319 RTMRel

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Обычно плохая практика - помещать свой собственный код в конструктор - VS может восстановить код конструктора, и тогда вы потеряете свои изменения.

Вы должны иметь возможность вызывать свой метод расширения, например, из Form_Load, т.е.

this.dateTimePicker1.Value = DateTime.Today.NextDay();
0 голосов
/ 16 марта 2012

Вы должны добавить пространство имен ExtensionMethodDesignWindowTest в форму1, вы это сделали?

В файле designer.cs добавить:

using ExtensionMethodDesignWindowTest;

РЕДАКТИРОВАТЬ

Измените свой код следующим образом, и он будет работать:

this.dateTimePicker1.Value = ExtensionMethodDesignWindowTest.DateTimeExtensions.NextDay(DateTime.Today);
...