Универсальный универсальный метод расширения (sic!) - PullRequest
2 голосов
/ 17 октября 2011

Можно ли добавить метод расширения к универсальному классу, который не зависит от универсального типа экземпляра этого класса?

Я хочу написать метод расширения для обработки значений Nullable.Пока что метод выглядит так:

public static object GetVerifiedValue(this Nullable<> obj)
{
    return obj.HasValue ? obj.Value : DBNull.Value;
}

Но компилятор не принимает тип Nullable<>.

Есть ли способ, которым я могу это сделать?

Примечание: я использую C # 3.0, .NET 3.5.

1 Ответ

5 голосов
/ 17 октября 2011

Просто сделайте это универсальным методом:

public static object GetVerifiedValue<T>(this Nullable<T> obj)
    where T : struct
{
    return obj.HasValue ? obj.Value : DBNull.Value;
}

Код вызова может использовать вывод типа при вызове:

int? x = 10;
object o = x.GetVerifiedValue();

РЕДАКТИРОВАТЬ: Другой вариант - использовать поведение бокса обнуляемых типов:

public static object GetVerifiedValue(object obj)
{
    return obj ?? DBNull.Value;
}

Конечно, это не подтверждает, что вы пытаетесь передать выражение типа значения, допускающего обнуляемость ...

...