Метод с параметром <T>

231
10 февраля 2017, 01:53

Есть необходимость задавать текстовую маску для двух компонентов разных типов. Каждый из них эту возможность поддерживает. Хочу решить это одним методом. Ранее никогда не пользовался, думаю пришло время изучить универсальные методы с . Пишу так:

  public static void SetDocNumMask<T>(int id_doctype, ref T ctrl)
        {   
         ctrl.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Simple;
         ctrl.Mask.EditMask = new string('0', 9);
        }

Студия ругается на слово Mask

Severity Code Description Project File Line Category Source Suppression State Error CS1061 'T' does not contain a definition for 'Mask' and no extension method 'Mask' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)

Вызываю метод в двух местах

Mask.SetDocNumMask<DevExpress.XtraEditors.ComboBoxEdit>(doc_‌​type, ref cbDocNum); 
Mask.SetDocNumMask< DevExpress.XtraEditors.Repository.RepositoryItemTextEdit>(id‌​_doctype, ref repForDocNum);

Что я делаю не так?

Answer 1

Считайте, что в вашем случае T - это object. Никто не дает гарантии, что в ctrl будет свойство Mask. Для того, чтобы это гарантировать, необходимо указать ограничение - базовый тип или интерфейс, который это свойство содержит:

interface IMasked
{
    MaskType Mask { get; }
}
public static void SetDocNumMask<T>(int id_doctype, ref T ctrl)
                        where T: IMasked // <<----
{   
    ctrl.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Simple;
    ctrl.Mask.EditMask = new string('0', 9);
}

З.Ы. Если тип может быть прямо вообще-вообще любой и никакого базового типа/интерфейса с Mask его не унаследовать, то можно ctrl объявить как dynamic. Проблемой будет плохая читаемость и отсутствие статической проверки типа компилятором.

READ ALSO
Может ли SSL сертификат блокировать SignalR

Может ли SSL сертификат блокировать SignalR

Проблема заключается в следующем, на стороне клинта, клиент может запустить задачу и она начинает выполняться на стороне сервера, а клиент...

337
Изменить цвет границ ячеек DataGridView

Изменить цвет границ ячеек DataGridView

Есть DataGridViewПодскажите, возможно ли изменить цвет границы всех ячеек? К примеру, сделать зеленым

549
Функция exif_read_data не отдает данные Orientation

Функция exif_read_data не отдает данные Orientation

Добрый день! В php есть функция exif_read_data, которая должна отдавать информацию о изображенииПри обработке изображения, загруженного со смартфона,...

291