Обнуляемый <T>как параметр - PullRequest
1 голос
/ 04 мая 2010

У меня уже есть это:

public static object GetDBValue(object ObjectEvaluated)
 {
  if (ObjectEvaluated == null)
   return DBNull.Value;
  else
   return ObjectEvaluated;
 }
used like:

 List<SqlParameter> Params = new List<SqlParameter>();
 Params.Add(new SqlParameter("@EntityType", GetDBValue(EntityType)));

Теперь я хотел сохранить тот же интерфейс, но расширить его, чтобы использовать его со значением NULL

 public static object GetDBValue(int? ObjectEvaluated)
 {
  if (ObjectEvaluated.HasValue)
   return ObjectEvaluated.Value;
  else
   return DBNull.Value;
 }

 public static object GetDBValue(DateTime? ObjectEvaluated)
 {...}

но я хочу только 1 функцию GetDBValue для обнуляемых значений. Как мне это сделать и сохранить вызов как есть? Это вообще возможно?

Я могу заставить его работать так:

 public static object GetDBValue<T>(Nullable<T> ObjectEvaluated) where T : struct
 {
  if (ObjectEvaluated.HasValue)
   return ObjectEvaluated.Value;
  else
   return DBNull.Value;
 }

Но вызов меняется на:

Params.Add(new SqlParameter("@EntityID ", GetDBValue<int>(EntityID)));

Ответы [ 3 ]

4 голосов
/ 04 мая 2010

Универсальная версия, которая у вас есть, подойдет, хотя вы можете сократить ее еще больше с помощью оператора слияния нуль:

public static object GetDBValue<T>(Nullable<T> ObjectEvaluated)
    where T : struct
{
    return ObjectEvaluated ?? (object)DBNull.Value;
}

Что вам может не хватать, так это то, что вам не нужно использовать универсальный параметр при его вызове; Вывод типа C # определит это для вас:

int? x = null;
object y = GetDBValue(x);
1 голос
/ 04 мая 2010

Я не уверен, что много баллов делает это; то, что у вас есть уже ящиков (поскольку оно возвращает object), вы также можете позволить CLR сделать это за вас. Просто:

public static object GetDBValue(object ObjectEvaluated)
{
  return ObjectEvaluated ?? DBNull.Value;
}

Не так много преимуществ добавление сюда дженериков (поскольку мы не используем T).

Вы, конечно, могли бы добавить универсальный метод, но что он добавляет?

1 голос
/ 04 мая 2010

Если EntityID (в вашем последнем примере) является типом Nullable, то компилятор будет знать, как вызвать GetDBValue без указания базового типа.

...