Есть необходимость задавать текстовую маску для двух компонентов разных типов. Каждый из них эту возможность поддерживает. Хочу решить это одним методом. Ранее никогда не пользовался, думаю пришло время изучить универсальные методы с . Пишу так:
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);
Что я делаю не так?
Считайте, что в вашем случае 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. Проблемой будет плохая читаемость и отсутствие статической проверки типа компилятором.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости