Это дао, ну и фактически репозиторий , но не слишком беспокоиться об этой разнице, поскольку он обращается к базе данных, используя контекст persistence.
Вы должны создайте класс обслуживания, который обертывает этот метод и где вызывается транзакция.
Иногда классы обслуживания не нужны, но когда у вас есть метод службы, который вызывает многие методы dao, их использование более оправдано.
Я обычно заканчиваю тем, что просто создаю службу, даже если она не нужна, чтобы гарантировать, что шаблоны остаются неизменными, а dao никогда не вводится напрямую.
Это добавляет дополнительный уровень абстракции, делая будущий рефакторинг более гибким.
Ответ таков: вам не нужно предоставлять перегрузки для ВСЕХ числовых типов, только для Double и Десятичный . Все остальные (за исключением, может быть, очень необычно больших) будут автоматически преобразованы в них.
Не базовый класс , но фактически это была красная сельдь. Базовый класс System.ValueType мало помогает, поскольку он включает типы, которые не являются числовыми. Ссылка на язык, которую я читал, в первую очередь привела меня в замешательство:)
(я просто искал, кому приписать ответ, и это была комбинация Пугало и Марка Гравелла, но так как они были комментариями, я имею поставьте ответ здесь)
Нет ни одного (или, по крайней мере, ни одного, который просто означает «числа»). Вы можете использовать:
void Foo<T>(T value) where T : struct {...}
Но это позволяет использовать любую структуру - не только числа. Если вы хотите сделать арифметику, могут быть полезны универсальные операторы . Кроме этого; перегружает его наиболее жизнеспособным вариантом.
Что я делаю:
public interface INumeric<T>
{
T Zero { get; }
T One { get; }
T MaxValue { get; }
T MinValue { get; }
T Add(T a, T b);
// T Substract(....
// T Mult...
}
public struct Numeric:
INumeric<int>,
INumeric<float>,
INumeric<byte>,
INumeric<decimal>,
// INumeric<other types>
{
int INumeric<int>.Zero => 0;
int INumeric<int>.One => 1;
int INumeric<int>.MinValue => int.MinValue;
int INumeric<int>.MaxValue => int.MaxValue;
int INumeric<int>.Add(int x, int y) => x + y;
// other implementations...
}
Теперь вы можете использовать его в методе:
bool IsZero<TNum, T>(TNum ops, T number)
where TNum : INumeric<T>
{
return number == ops.Zero;
}
или в методе расширения
public static bool IsZero<TNum, T>(this TNum ops, T number)
where TNum : INumeric<T>
{
return number == ops.Zero;
}
и в вашем код:
...
var n = new Numeric(); // can be an static prop
Console.WriteLine(IsZero(n, 5)); // false
Console.WriteLine(IsZero(n, 0f)); // true
Console.WriteLine(IsZero(n, "0")); // compiler error
или, с методом расширения:
Console.WriteLine(n.IsZero(5)); // false
Console.WriteLine(n.IsZero(0f)); // true
Console.WriteLine(n.IsZero("0")); // compiler error
Перегружены ли сигнатуры методов здесь? Если вы хотите, чтобы ограниченная группа методов выполняла одну и ту же задачу, вы можете загрузить открытый метод и вызвать закрытый метод, который принимает любое число, путем преобразования входных данных в двойные.
Краткий ответ: числовые типы являются типами значений, поэтому они являются производными от System.ValueType. Полный ответ: вы должны прочитать эту статью из MSDN . Более того, я думаю, что вы должны прочитать справочник по языку C # :). Тип значения не равен числовому типу, поскольку типы значений включают также структуры и перечисления.
Базовым классом числовых типов является ValueType
.
К сожалению, это все равно не поможет: DateTime
, bool
, Enum
и сотни других типов также являются производными от ValueType
. В .NET нет базового класса NumericType
.