2012-04-06 3 views
0

Эта универсальная вспомогательная функция выполняет итерацию по списку объектов, обращаясь к их общедоступным свойствам и выплескивая одну строку с разделителями-запятыми для каждого объекта.PropertyInfo.GetValue (obj, null) truncating strings

/// <summary> 
    /// Format the properties as a list of comma delimited values, one object row per. 
    /// </summary> 
    /// <typeparam name="T">Type of class contained in the List</typeparam> 
    /// <param name="list">A list of objects</param> 
    /// <returns>a list of strings in csv format</returns> 
    public static List<string> ToCSV<T>(this IEnumerable<T> list) 
     where T : class 
    { 
     var results = new List<string>(); 
     bool firstTime = true; 
     foreach (var obj in list) 
     { 
      // header data 
      if (firstTime) 
      { 
       firstTime = false; 
       string line = String.Empty; 
       foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties()) 
       { 
        if (propertyInfo.CanRead) 
        { 
         line += propertyInfo.Name + ','; 
        } 
       } 
       results.Add(line); 
      } 
      else 
      { 
       string line = String.Empty; 
       foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties()) 
       { 
        if (propertyInfo.CanRead) 
        { 
         object value = propertyInfo.GetValue(obj, null); 
         if (value.GetType() == typeof(string)) 
         { 
          line += "\"" + value.ToString() + "\"" + ","; 
         } 
         else 
         { 
          line += value.ToString() + ","; 
         } 
        } 
       } 
       results.Add(line); 
      } 
     } 
     return results; 
    } 

Один из классов итерируемого этого метода имеет свойство строки, которая усекается:

string BusinessItem { get; set; } // "0000", a legitimate business value 

Проблематика немного здесь:

object value = propertyInfo.GetValue(obj, null); // value == 0 

Как получить значение свойства как строки, а не int?

+3

Если свойство определено как строка, результатом будет строка. Что-то еще кажется немного выключенным. –

+0

Да, я этого не покупаю. Номер '0000' эквивалентен числу' 0', поэтому нет смысла ожидать произвольное число '0'. Если это строка, то '' 0 "' много отличается от '' 0000 "'. Я думаю, что происходит что-то еще. –

+0

Пожалуйста, предоставьте краткую, но * полную * программу, демонстрирующую проблему. –

ответ

3

Рассмотрим эту проверку:

if (value.GetType() == typeof(string) && (value as string).Contains(',')) 

Это означает, что значение строка будет записана в кавычки только если она содержит запятую.

Строковое значение "0000" будет указано как 0000,. Если код, который читает файл, проверяет, является ли значение всеми цифрами, чтобы определить, является ли это числом, которое будет анализироваться как число, а не как строка. В этом случае вы должны написать все строки с кавычками, а не только строки, содержащие запятую.

+0

Хорошая точка. Будет обновляться в сообщении, поскольку он напрямую не связан с вопросом. –

+0

@ DanielHarvey: Что значит сказать: «Это не связано с вопросом?» – Tigran

+0

@ DanielHarvey: Попробуйте обновление в реальном коде, а не только в вопросе. – Guffa

Смежные вопросы