2015-03-06 3 views
0

В настоящее время я написал метод расширения для DataRow, который преобразует значение строки к определенному типу объекта, метод выглядит следующим образом:метод расширения для DataRow объекта .NET

<ExtensionAttribute> _ 
Public Function GetValue(Of T)(row As DataRow, columnName As String) As T 
    'IF TABLE DOESN'T CONTAIN COLUMN RETURN DEFAULT OF T 
    If Not row.Table.Columns.Contains(columnName) Then 
     Return Activator.CreateInstance(Of T)() 

    'IF ROW IS DB NULL RETURN DEFAULT OF T 
    If row(columnName) Is DBNull.Value Then 
     Return Activator.CreateInstance(Of T)() 
     'RETURN T 

    Return CType(row(columnName), T) 
End Function 

Мой вопрос заключается в том, как улучшить этот метод что пользователь может установить значение по умолчанию для объекта (T) (например, для логического типа, который не возвращает значение FALSE по умолчанию, чем значение TRUE). Конечно, это будет необязательный параметр метода расширения.

+3

Знаете ли вы, что уже существует такая функция в структуре под названием 'T Field (эта строка DataRow, string columnName)'? См. Https://msdn.microsoft.com/en-us/library/bb360891(v=vs.90).aspx – Magnus

+1

@Magnus: ... который даже поддерживает типы с возможностью NULL, которые лучше, чем использование значения по умолчанию для данный тип (что делает OP). –

ответ

1

Не мог ли пользовательский по умолчанию просто быть параметром метода? Что-то вроде этого:

<ExtensionAttribute> _ 
Public Function GetValue(Of T)(row As DataRow, columnName As String, defaultValue As T) As T 
    If Not row.Table.Columns.Contains(columnName) Then 
     Return defaultValue 
    If row(columnName) Is DBNull.Value Then 
     Return defaultValue 
    Return CType(row(columnName), T) 
End Function 

Настройка дополнительного параметра может быть сложным между потенциальной ценностью и ссылочных типов T. Вы можете наложить некоторые ограничения на T. Хотя, если вы сохраняете оба метода, параметр по-прежнему необязателен, потому что это перегрузка метода, что может быть проще.