2012-06-12 2 views
3

Я пытаюсь сбрасывать информацию о свойствах переменных в простую строку, но когда она попадает в мои обнуляемые bools, as string всегда возвращает null - даже если истинное значение истинно | ложный!C# Значение bool как строка всегда null

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

Это именно то, что 'как' должен делать. – SLaks

+0

Я настоятельно рекомендую добавить «null», если значение равно null. У вас может быть свойство string, которое будет иметь значение «» - было ли оно нулевым или было пустым? Вы не можете сказать. Поэтому вам лучше пойти с '?:' Или '??', чтобы нулевые значения были записаны как «null» или какая-то другая нуль-идентифицирующая строка. – SimpleVar

ответ

4

Оператор as возвращает отлитое значение, если экземпляр такого точного типа, или null в противном случае.

Вместо этого вы должны .Append(property.GetValue(...)); Append() будет автоматически обрабатывать нули и конверсии.

+1

Append будет обрабатывать нули, но он сделает это, не добавляя ничего - что может быть или не быть желательным. –

0

Вы не можете наложить bool на строку. Вы должны использовать ToString()

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» как отсутствующие записи.

1

Это потому, что тип свойства не является строкой. Измените его на:

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

Если оно равно null, оно будет получать нуль, и это нормально. Для ненулевых значений он возвращает значение строки значения свойства.

2

Самое ценное решение было бы, на мой взгляд:

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

Если значение равно нулю, это добавит «нуль», а если нет - он будет вызывать ToString Значение и добавить, что.

Объединение, что с Linq вместо цикла Еогеасп, вы можете иметь хороший кое-что:

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 быстрее, чем добавление к StringBuilder, поэтому я подумал, что вы можете увидеть это решение.

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; } 
}