У меня есть вот такой интерфейс
public interface IParse
{
T TryParse<T>(string line, string pattern);
}
и класс, который его реализует, содержит примерно вот такой метод
public DateTime TryParse<DateTime>(string line, string pattern)
{
Match match = Regex.Match(line, pattern);
if (!match.Success)
{
throw new Exception();
}
DateTime date;
var success = DateTime.TryParse(match.Value, out date);
if (!success)
{
throw new Exception();
}
return date;
}
Я бы хотел иметь возможность возвращать null из метода TryParse, но написать например T? TryParse<T?>(string line); нельзя. Существует ли возможность типизации nullable'ом?
К тому же еще возникла проблема - DateTime.TryParse(match.Value, out date); дает ошибку "'DateTime' is a type parameter, which is not valid in the given context", то есть DateTime теперь воспринимается теперь как тип дженерика, а не статический класс и запарсить тоже не выходит.
UPD. Изначально задача примерно такая: есть файл, в котором построчно лежат данные, из которых можно собрать объект. Пусть будет например ДатаРождения, ФИО, Профессия, Зарплата, Стаж. Данные эти обрамлены всякими ненужными деталями, вроде html-тегов, причем разного формата. И мне нужно формировать из них объекты, причем надо сделать возможность конфигурирования структуры объектов без переписывания кода. Например, нужен объект из ДатыРождения, ФИО, Стаж. Или ДатаРождения, ФИО, Профессия. За признак начала новой записи можно взять ДатуРождения.
Соответственно, я планировал решить так: сделать интерфейс с обобщенным методом Parse. Написать несколько классов, каждый из которых реализует метод Parse по-своему, типизируя его типом, подходящим под каждое поле - DateTime, string, string, decimal, int, а еще содержащим регулярку, отсекающую html-шум, характерный для поля. Далее сделать класс-контейнер, в который передать эти парсеры и читать исходные строки, прогоняя каждую через список парсеров. Если парсер может извлечь свои данные из этой строки, он это делает и добавляет результат в конечный объект. Таким образом, если мне понадобится в следующий раз другой список полей, я просто в контейнер передам другие экземпляры парсеров.
public DateTime? TryParse<DateTime?>(string line, string pattern). Правда в таком виде меня лично не устроил бы вариант TryParse - обычно в дотнете оно возвращает bool, а результат парсинга отдает в out параметр. – Monk Sep 14 '20 at 06:59var parsers = new List<IParse>(new IntParse(), new DateParse());не даст так сделать, тип затребует для IParse – Sep 14 '20 at 12:29where T : Nullable<T>– Sep 15 '20 at 06:24