Использование TryParse для установки значений свойств объекта
-
08-07-2019 - |
Вопрос
В настоящее время я выполняю рефакторинг кода для замены Convert.To на TryParse.
Я обнаружил следующий фрагмент кода, который создает и присваивает свойство объекту.
List<Person> list = new List<Person>();
foreach (DataRow row in dt.Rows)
{
var p = new Person{ RecordID = Convert.ToInt32(row["ContactID"]) };
list.Add(p);
}
В качестве замены я придумала следующее:
var p = new Person { RecordID = Int32.TryParse(row["ContactID"].ToString(), out RecordID) ? RecordID : RecordID };
Есть мысли, мнения, альтернативы тому, что я сделал?
Решение
Напишите метод расширения.
public static Int32? ParseInt32(this string str) {
Int32 k;
if(Int32.TryParse(str, out k))
return k;
return null;
}
Другие советы
Я бы использовал альтернативную реализацию TryParse
, которая возвращает int?
:
public static int? TryParseInt32(string x)
{
int value;
return int.TryParse(x, out value) ? value : (int?) null;
}
Тогда вы можете написать:
var p = new Person { RecordID = Helpers.TryParseInt32(row["ContactID"].ToString()) ?? 0 };
(Или, если хотите, используйте другое значение по умолчанию - в любом случае оно будет видно в вашем коде.)
Я предлагаю отделить часть TryParse от инициализатора. Это будет более читабельным.
int recordId;
Int32.TryParse(row["ContactID"].ToString(), out recordID)
foreach (DataRow row in dt.Rows)
{
var p = new Person{ RecordID = recordId };
list.Add(p);
}
private static void TryToDecimal(string str, Action<decimal> action)
{
if (decimal.TryParse(str, out decimal ret))
{
action(ret);
}
else
{
//do something you want
}
}
TryToDecimal(strList[5], (x) => { st.LastTradePrice = x; });
TryToDecimal(strList[3], (x) => { st.LastClosedPrice = x; });
TryToDecimal(strList[6], (x) => { st.TopPrice = x; });
TryToDecimal(strList[7], (x) => { st.BottomPrice = x; });
TryToDecimal(strList[10], (x) => { st.PriceChange = x; });
Не связан с StackOverflow