我正在尝试将变量属性信息转储到一个简单的字符串,但是当它到达我的可空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。
任何人都能解释为什么会这样吗?甚至更好,一个解决方法?
答案 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; }
}