Одна из альтернатив -- использовать Import\Export атрибуты. Правда это скорее всего только для случая "нужно проинициализировать 100500 полей, проект простой, а мне лень".
Подход через интерфейсы все же более правильный и удобный. Например в случае чего можно на определенную реализацию навесить прокси, что через классы не всегда получится сделать (реализация может быть запечатана для наследования, нельзя перегрузить методы, либо объект создается через фабрику)
Идея статьи интересная, и возможно даже имеет место применения, но конкретные примеры я бы скорее всего не использовал. Option<T> для случаев когда T - структура полностью заменяется Nullable<T>
int? Parse(string val)
=> int.TryParse(val, out var result)
? result
: null;
Result<TOk, TError> уже выглядит поинтересней, но конкретно финальная реализация немного смущает тем, что static class Result начинает возвращать не Result<TOk, TError>, а DelayedOk, что не всегда позволяет его использовать как create-метод, так как нельзя будет сделать например такое
var result = Result.Ok(1);
result = Parse("1");
а нужно будет явно объявлять
Result<int, int> result = Result.Ok(1);
result = Parse("1");
Но повторюсь: скорее всего такой финт ушами действительно может пригодится, просто в менее распространенных задачах.
Одна из альтернатив -- использовать Import\Export атрибуты. Правда это скорее всего только для случая "нужно проинициализировать 100500 полей, проект простой, а мне лень".
Подход через интерфейсы все же более правильный и удобный. Например в случае чего можно на определенную реализацию навесить прокси, что через классы не всегда получится сделать (реализация может быть запечатана для наследования, нельзя перегрузить методы, либо объект создается через фабрику)
Идея статьи интересная, и возможно даже имеет место применения, но конкретные примеры я бы скорее всего не использовал. Option<T> для случаев когда T - структура полностью заменяется Nullable<T>
Result<TOk, TError> уже выглядит поинтересней, но конкретно финальная реализация немного смущает тем, что static class Result начинает возвращать не Result<TOk, TError>, а DelayedOk, что не всегда позволяет его использовать как create-метод, так как нельзя будет сделать например такое
а нужно будет явно объявлять
Но повторюсь: скорее всего такой финт ушами действительно может пригодится, просто в менее распространенных задачах.