我正在使用反射将对象转换为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
答案 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
是假的
右边的代码只会在值不为空时运行,这是没有意义的。