Я пытался возиться с общими типами и абстракциями для личного проекта библиотеки, но я столкнулся с проблемой.
Я нашел этот пост , это было похоже на то, что я хотел сделать, но я хотел сделать еще один шаг вперед. потому что я хотел ограничить мою функцию универсальным параметром только несколькими типами
что-то вроде:
public static T Read<T>(T? min, T? max) where T: int, float, double, anything i want
{
}
Я знаю, что это невозможно, но я пытаюсь найти обходные пути для достижения чего-то похожего
Я пытался установить для использования: T?
но я получаю сообщение о том, что T не может быть обнуляемым для использования в качестве параметра.
Как вы можете видеть из:
where F : ConsoleReadType<T>
Я пытаюсь разрешить запуск только унаследованных классов.
public abstract class ConsoleReadType<T>
{
public abstract T Read();
public abstract T Read(T? min, T? max);
public virtual F ReadUntilCorrect<F>(Func<F> FunctionToRun, string message = "") /*where F : ConsoleReadType<T>*/
{
while (true)
{
try
{
return FunctionToRun();
}
catch (ConsoleInputException)
{
if (!string.IsNullOrEmpty(message))
ConsoleWrite.Error(message);
}
}
}
}
public class ConsoleReadDouble : ConsoleReadType<double>
{
public override double Read()
{
if (!double.TryParse(Console.ReadLine().Replace(".", ","), out double ret))
{
throw new ConsoleInputException();
}
return ret;
}
public override double Read(double? min, double? max)
{
if (!double.TryParse(Console.ReadLine().Replace(".", ","), out double ret))
{
throw new ConsoleInputException("invalid input format");
}
if (min.HasValue && ret < min || max.HasValue && ret > max)
{
throw new ConsoleInputException("input value should be between: " + min + " and " + max);
}
return ret;
}
}
Итак, основные вопросы:
1. Есть ли способ установить обнуляемые переменные T абстрактно или есть лучший способ добиться того, что я пытаюсь сделать?
2. Могу ли я разрешить только определенные функции с оператором where?
3. Есть ли способ сделать эти классы статичными в конце, чтобы их можно было использовать в качестве помощника, не создавая их экземпляры?
4. Меня также интересует любой совет, который вы могли бы дать мне по поводу моего кода
Большое спасибо.