C#bool值作为字符串始终为null

时间:2012-06-12 20:36:46

标签: c# boolean nullable tostring

我正在尝试将变量属性信息转储到一个简单的字符串,但是当它到达我的可空bool时,as string总是返回null - 即使实际值为true |假!

StringBuilder propertyDump = new StringBuilder();

foreach(PropertyInfo property in typeof(MyClass).GetProperties())
{
    propertyDump.Append(property.Name)
                .Append(":")
                .Append(property.GetValue(myClassInstance, null) as string);
}

return propertyDump.ToString();

不会抛出异常;快速和输出正是我想要的,除了bool?的任何属性总是假的。如果我快速观察并.ToString()它可行!但我不能保证其他属性实际上不是null。

任何人都能解释为什么会这样吗?甚至更好,一个解决方法?

6 个答案:

答案 0 :(得分:5)

bool不是一个字符串,所以as运算符在传递一个盒装布尔值时返回null。

在您的情况下,您可以使用以下内容:

object value = property.GetValue(myClassInstance, null);

propertyDump.Append(property.Name)
            .Append(":")
            .Append(value == null ? "null" : value.ToString());

如果您想要空值而不附加任何文字,您可以直接使用Append(Object)

propertyDump.Append(property.Name)
            .Append(":")
            .Append(property.GetValue(myClassInstance, null));

这将有效,但在“propertyDump”输出中将null属性保留为缺少的条目。

答案 1 :(得分:4)

如果实例具有该确切类型,则as运算符返回一个转换值,否则返回null

相反,你应该.Append(property.GetValue(...)); Append()会自动处理空值和转化。

答案 2 :(得分:2)

在我看来,最好的解决方案是:

.Append(property.GetValue(myClassInstance, null) ?? "null");

如果值为null,它将追加“null”,如果不是 - 它将调用值的ToString并追加它。

将它与Linq结合而不是foreach循环,你可以有一个不错的东西:

var propertyDump =
    string.Join(Environment.NewLine,
                typeof(myClass).GetProperties().Select(
                    pi => string.Format("{0}: {1}",
                                        pi.Name,
                                        pi.GetValue(myClassInstance, null) ?? "null")));

(在VS的宽屏幕上看起来更好)。

如果比较速度,顺便说一下,它结果是字符串。加入比附加到StringBuilder更快,所以我想你可能想要看到这个解决方案。

答案 3 :(得分:1)

那是因为属性的类型不是字符串。将其更改为:

Convert.ToString(property.GetValue(myClassInstance, null))

如果它为null,它将检索null,这没关系。对于非空值,它将返回属性值的字符串表示

答案 4 :(得分:0)

您无法将bool强制转换为字符串。您必须使用ToString()

答案 5 :(得分:0)

使用null coalesing operator处理Null情况:

void Main()
{

   TestIt tbTrue = new TestIt() { BValue = true }; // Comment out assignment to see null

   var result =
    tbTrue.GetType()
          .GetProperties()
          .FirstOrDefault( prp => prp.Name == "BValue" )
          .GetValue( tb, null ) ?? false.ToString();

      Console.WriteLine ( result ); // True

}

public class TestIt
{
   public bool? BValue { get; set; }
}