C#在引用之前检查对象是否存在

时间:2017-07-27 20:38:33

标签: c# epplus

我想知道是否有办法在引用之前检查对象是否存在。不只是检查它是否为null,因为它也不起作用。我使用EPPlus包来读取excel文件,当它到达一个没有任何值数据的索引时,它会发送一个异常。

private DataTable WorksheetToDataTable(string tableName)
{
    excelSheet = excelWorkbook.Worksheets[tableName];
    DataTable dt = new DataTable();
    try
    {
        int totalRows = excelSheet.Dimension.End.Row;
        int totalCols = excelSheet.Dimension.End.Column;
        for (int j = 1; j <= totalCols; j++)
        {

            dt.Columns.Add();
            for (int i = 1; i <= totalRows; i++)
            {
                if (j == 1)
                {
                    dt.Rows.Add();
                }
                try
                {
                    dt.Rows[i - 1][j - 1] = excelSheet.Cells[i, j].Value.ToString();
                    //dt.Rows[i - 1][j - 1] = Object.ReferenceEquals(null, excelSheet.Cells[i, j].Value.ToString()) ? "" : excelSheet.Cells[i, j].Value.ToString();
                }
                catch
                {
                    dt.Rows[i - 1][j - 1] = "";
                }
            }
        }
        return dt;
    }
    catch
    {
        MessageBox.Show("Error: Referenced Excel Table is empty, or indexed improperly! Check Excel formatting.", "Error");
        return dt;
    }
}

所以你可以看到我已经尝试检查excelSheet.Cells[i, j].Value.ToString()之前是否为null并且它发送了我在上面的try / catch中捕获的相同异常。我必须解析很多单元格,其中很多都是完全空的,这增加了很多

  

抛出异常:BBSApp.exe中的'System.NullReferenceException'

到输出控制台。有没有办法在我调用对象之前检查对象是否存在,甚至在没有try / catch的情况下检查它是否为null?

if(excelSheet.Cells[i, j].Value.ToString() != null)

如上所示,只需检查它是否为null就会发送相同的异常,因为它首先不存在。

3 个答案:

答案 0 :(得分:4)

试试这个:

if(excelSheet.Cells[i, j].Value != null)

您正在检查Value属性是否为null。出现空引用异常是因为您尝试在ToString()对象上调用方法null

或者,您可以使用null访问运算符:

if(excelSheet.Cells[i, j]?.Value?.ToString() != null)

答案 1 :(得分:3)

根据the documentation,您应该使用IsEmpty

  

如果指定的Range对象为空,则返回值Empty(使用IsEmpty函数测试此情况)。如果Range对象包含多个单元格,则返回一个值数组(使用IsArray函数测试此情况)。

示例:

if (!excelSheet.Cells[i, j].Value.IsEmpty)
{
    dt.Rows[i - 1][j - 1] = excelSheet.Cells[i, j].Value.ToString();
}

答案 2 :(得分:1)

在访问excelSheet字段之前,您可以使用空检查传播检查对象是否已初始化:

if (excelSheet.Cells[i, j]?.Value != null)
    // Do whatever