3

我正在尝试将变量属性信息转储到一个简单的字符串,但是当它到达我的可为空布尔值时,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()这一点!但我不能保证其他属性实际上不为空。

谁能解释这是为什么?甚至更好的解决方法?

4

6 回答 6

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”输出中的空属性保留为缺失条目。

于 2012-06-12T20:39:04.680 回答
4

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

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

于 2012-06-12T20:39:00.277 回答
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 的宽屏上看起来更好)。

顺便说一下,如果你比较速度,结果是 string.Join 比 Appending to a StringBuilder 更快,所以我想你可能想看看这个解决方案。

于 2012-06-12T20:49:57.577 回答
1

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

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

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

于 2012-06-12T20:40:26.283 回答
0

您不能将布尔值转换为字符串。你必须使用ToString()

于 2012-06-12T20:38:54.320 回答
0

使用null 合并运算符来处理 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; }
}
于 2012-06-12T20:51:43.947 回答