我必须检查列是否存在,然后继续从第一行获取值。但是如此多的ifs看起来非常渴望
theData = GetData();
if (theData.Rows.Count > 0)
{
MyModel = new CustomModel();
dataSetRow = theData.Rows[0];
if (theData.Columns.Contains("Column1"))
{
if ((!object.ReferenceEquals(dataSetRow["Column1"], DBNull.Value)))
{
MyModel.Column1 = Convert.ToString(dataSetRow["Column1"]);
}
}
if (theData.Columns.Contains("Column2"))
{
if ((!object.ReferenceEquals(dataSetRow["Column2"], DBNull.Value)))
{
MyModel.Column2 = Convert.ToString(dataSetRow["Column2"]);
}
}
if (theData.Columns.Contains("Column3"))
{
if ((!object.ReferenceEquals(dataSetRow["Column3"], DBNull.Value)))
{
MyModel.Column3 = Convert.ToString(dataSetRow["Column3"]);
}
}
if (theData.Columns.Contains("Column4"))
{
if ((!object.ReferenceEquals(dataSetRow["Column4"], DBNull.Value)))
{
MyModel.Column4 = Convert.ToString(dataSetRow["Column4"]);
}
}
有没有办法可以使代码紧凑而不是如此多的ifs。
答案 0 :(得分:7)
一种选择是将重复的代码段提取到一个单独的方法中:
private string GetRowValue(DataRow dr, string columnName)
{
if (dr.Table.Columns.Contains(columnName))
{
if ((!object.ReferenceEquals(dr[columnName], DBNull.Value)))
{
return Convert.ToString(dr[columnName]);
}
}
return string.Empty;
}
然后调用它来设置MyModel
值:
dataSetRow = theData.Rows[0];
MyModel = new CustomModel
{
MyModel.Column1 = GetRowValue(dataSetRow, "Column1"),
MyModel.Column2 = GetRowValue(dataSetRow, "Column2"),
...
};
答案 1 :(得分:2)
好的,这稍微短一些。它适合你吗? ;)
if (theData.Columns.Contains("Column1") && dataSetRow["Column1"] != DBNull.Value)
MyModel.Column1 = dataSetRow["Column1"].ToString();
顺便说一句,只有当dataSetRow["Column1"] != DBNull.Value
中的值为DBNull(因为dataSetRow
会产生时)您不想获取空字符串时,才需要此DBNull.Value.ToString()
检查""
,而非NullReferenceException
)。
答案 2 :(得分:1)
将所有列名称放在名为columns的列表中,我假设它们的调用方式与对象属性相同
theData = GetData();
if (theData.Rows.Count > 0)
{
MyModel = new CustomModel();
dataSetRow = theData.Rows[0];
foreach(column in columns)
{
if (theData.Columns.Contains(column))
{
if ((!object.ReferenceEquals(dataSetRow[column], DBNull.Value)))
{
MyModel.GetType().InvokeMember(column,
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
Type.DefaultBinder, MyModel, Convert.ToString(dataSetRow[column]));
}
}
}
}
如果属性al调用不同,则只需迭代2列表以调用正确的属性名称