В .NET String.Format принимает объекты типа, которые не соответствуют строке формата - PullRequest
1 голос
/ 07 июля 2011

У меня есть функция, которая получает String и DataRow.

String - это пользовательский форматтер. Идея состоит в том, чтобы сделать это

String.Format(passed_in_String, DataRow("ColumnINeed"))

Причина, по которой это делается, заключается в том, что на данный момент мы не знаем, что содержит столбец.

Однако, если форматтер имеет значение «{0: MM / dd / yyyy}» и DataRow («ColumnINeed») является целым числом, содержащим 42, String.Format возвращает: MM/dd/yyyy

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

Есть ли способ заставить String.Format генерировать исключение, если объект не соответствует ожидаемой строке формата?

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

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

Если это исключительно , если данные в столбце не являются датой, то вытащите их как дату.Не вытаскивайте его и надейтесь, что он отлично сформатируется, вытащите его как единое целое!

DateTime myDate = (DateTime)datarow["MyColumn"]; // C#
Dim myDate As DateTime = CType(datarow("MyColumn"), DateTime) 'VB

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

Редактировать: Крис упоминает хорошее альтернативное предложение в комментариях.Вы также можете написать

DateTime myDate = datarow.Field<DateTime>("MyColumn");

Преимущество здесь в том, что если в столбце допустимы нули?

DateTime? myDate = (DateTime?)datarow["MyColumn"]; // C#
Dim myDate = CType(datarow("MyColumn"), DateTime?) 'VB

Здесь вы можете получить «Указанное приведение не действительное», если строка содержит DBNull.

DateTime? myDate = datarow.Field<DateTime?>("MyColumn"); // C#
Dim myDate = datarow.Field(of DateTime?)("MyColumn") 'VB

Этот альтернативный вариант обрабатывает DBNull соответствующим образом.

0 голосов
/ 07 июля 2011

Причина, по которой это делается, заключается в том, что на данный момент мы не знаем, что содержит столбец.

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

Вот пример. Вместо

function myCoolFormatter(string passed_in_String, DataRow drow) { 
    object data = drow("ColumnINeed");
    return string.Format(passed_in_String, data);
}

использование

function myCoolFormatter<T>(string passed_in_String, DataRow drow) { 

    // will raise an exception if ColumnINeed is not of type T
    T data = drow.Field<T>("ColumnINeed");

    return string.Format(passed_in_String, data);
}

Ваша функция может быть вызвана так:

var myFormattedString = myCoolFormatter<DateTime>("Date: {0:MM/dd/yyyy}",
                                                  dataRowWithDateTimes);
...