2013-06-13 3 views
2

. Предыстория заключается в том, что я хочу иметь возможность инициализировать пустую строку для DataTable без необходимости всегда проверять на наличие DBNull.Value. У меня есть метод расширения, который создает новую пустую строку, а затем заполняет каждое из значений в строке по умолчанию для этого столбца.Для каждой переменной, недоступной для каждой области.

<Extension()> _ 
Public Function NewBlankRow(ByVal table As DataTable) As DataRow 
    Dim row As DataRow = table.NewRow() 
    For Each col As DataColumn In table.Columns 
     row(col.ColumnName) = CType(Nothing, col.DataType) 
    Next 
    Return row 
End Function 

Я получаю следующее сообщение для второго использования седловины (один в CType)

Cannot resolve symbol 'col' 

Для C-четче, называя CType(Nothing, T) должен быть таким же, как вызов Default<T>

ли есть лучший способ сделать это? Почему я не могу получить доступ к col внутри CType?

ответ

3

CType не является функцией исполнения. Это время компиляции. Тип данных во втором аргументе должен быть указан во время компиляции.

http://msdn.microsoft.com/en-us/library/4x2877xb%28v=vs.80%29.aspx

CType компилируется рядный, что означает, что код преобразования является частью кода, который вычисляет выражение. В некоторых случаях нет вызова процедуры для выполнения преобразования, что ускоряет выполнение.

Это не то же самое, как Default<T> в данном случае, потому что NewBlankRow не является универсальным методом. Независимо от того, Default<T> также время компиляции и не доступно, если T указано как выражение времени выполнения.

Чтобы создать экземпляр по умолчанию col.DataType, вы можете использовать отражение, например Activator.CreateInsatnce(col.DataType).

+0

ничего себе! отличный ответ. Благодаря! – KyleMit

Смежные вопросы