Я хочу инициализировать класс данными из базы данных MySql.Некоторые поля могут быть нулевыми:
Dim dr As MySqlDataReader = ...
Dim item As New Item(dr.GetInt16(0), dr.GetString(1), dr.GetString(2))
Предположим, что последние два поля могут быть NULL в БД, так что вызов GetString для этого поля вызывает исключение.
Я, конечно, мог бы написать код для проверки на NULL до того, как получу каждое поле:
dim field1 as String
if ( dr.IsDbNull(1) )
field1 = Nothing ' or even ""
else
field1 = dr.GetString(1)
Но если у вас много полей, это кошмар "ifs".
С этой целью я переписал функцию IIf VB, чтобы сделать ее более типизированной, чтобы избежать приведения:
Namespace Util
Public Shared Function IIf(Of T)(ByVal condition As Boolean, ByVal iftrue As T, ByVal iffalse As T) As T
If condition Then Return iftrue Else Return iffalse
End Function
Чтобы я мог написать что-то вроде:
Dim item As New Item(
dr.GetInt16(0),
Util.IIf(dr.IsDbNull(1), "", dr.GetString(1),
Util.IIf(dr.IsDbNull(2), "", dr.GetString(2))
Набранный IIf хорошо работает в других случаях, но, к сожалению, в данном случае это не так, поскольку , будучи обычной функцией, а не ключевым словом языка , оценивается каждый входной параметрво время вызова и когда поле имеет значение NULL, возникает исключение.
Можете ли вы придумать элегантное решение, если не учитывать?