使用反射时检查null

时间:2018-06-05 12:51:34

标签: c#

我正在使用反射将对象转换为csv。有时,我得到抛出异常的空值,所以我想出来检查null并用空字符串替换null。但是我得到一个错误,因为我无法将对象转换为字符串。问题在于这行代码。

  

if(properties [i] .GetValue(this)是String&&   string.IsNullOrEmpty(属性[I] .GetValue(本)))

 public abstract class CsvableBase
 {
    public virtual string ToCsv()
    {
        string output = "";
        var properties = GetType().GetProperties();
        for (var i = 0; i < properties.Length; i++)
        {
            if(properties[i].GetValue(this) is DateTime)
            {
                 output +=((DateTime)properties[i].GetValue(this)).ToString("yyyy-MM-dd HH:mm:ss");
            }
            else if(properties[i].GetValue(this) is String && string.IsNullOrEmpty(properties[i].GetValue(this)))
            {
                 output += "";
            }
            else
            {
                 output +=   properties[i].GetValue(this).ToString();
            }

            if (i != properties.Length - 1)
            {
                output += ",";
            }
        }
        return output;
    }
}
//Read more at https://www.pluralsight.com/guides/microsoft-net/building-a-generic-csv-writer-reader-using-reflection#VHy18mLqdMT3EGR5.99

2 个答案:

答案 0 :(得分:1)

虽然GetValue()返回的值在运行时是一个字符串,但GetValue()的返回类型object,因此您无法将其传递给{{ 1}}没有施放。

你可以这样做:

string.IsNullOrEmpty()

在C#7之前,它会更加冗长:

if(properties[i].GetValue(this) is String s 
   && string.IsNullOrEmpty(s))

答案 1 :(得分:1)

你在想它。只需在for循环的顶部评估一次值,并检查一次null。

您不需要尝试区分字符串空值和其他类型的null。在运行时,无论如何它们都只是空对象。

您不需要+= "",因为它没有做任何事情。

for (var i = 0; i < properties.Length; i++)
{
    object value = properties[i].GetValue(this);
    if (value == null)
    {
        //do nothing
    }
    else if (value is DateTime)
    {
         output += ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss");
    }
    else
    {
         output += value.ToString();
    }

    if (i != properties.Length - 1)
    {
        output += ",";
    }
}

旁注:

else if (properties[i].GetValue(this) is String && string.IsNullOrEmpty(properties[i].GetValue(this)))

显然是错误的,因为如果值为null,那么你有:

else if (null is String && string.IsNullOrEmpty(properties[i].GetValue(this)))

null is String是假的 右边的代码只会在值不为空时运行,这是没有意义的。