OK. Let’s generalize the problem (see comments for the question): let us join all the properties which are:
public
and notstatic
.- Readable and Writable.
- Not indexers (what should we do with
this[int, int]
property?). - Of specified types (e.g.
string
,int
,decimal
,double
) only (how can we save, a property of, say,IComparer<int>
type?).
We can obtain such properties with a help of Reflection and Linq:
using System.Linq;
using System.Reflection;
...
HashSet<Type> allowedTypes = new HashSet<Type>() {
typeof(string), typeof(int), typeof(decimal), typeof(double)
};
var properties = typeof(Car)
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(prop => prop.CanRead && prop.CanWrite)
.Where(prop => !prop.GetIndexParameters().Any())
.Where(prop => allowedTypes.Contains(prop.PropertyType))
// .Where(prop => ...) // Add here more coditions if required
.ToArray();
Now, having these properties
we can save values into a file:
using System.IO;
using System.Linq;
...
File.WriteAllLines(@"D:\WriteLines.txt", cars
.Select(car => string.Join(",", properties
.Select(property => property.GetValue(car)))));
Finally, you can combine these parts into a single routine:
private static void SaveToFile<T>(IEnumerable<T> source, string fileName) {
HashSet<Type> allowedTypes = new HashSet<Type>() {
typeof(string), typeof(int), typeof(decimal), typeof(double)
};
var properties = typeof(T)
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(prop => prop.CanRead && prop.CanWrite)
.Where(prop => !prop.GetIndexParameters().Any())
.Where(prop => allowedTypes.Contains(prop.PropertyType))
// .Where(prop => ...) // Add here more coditions if required
.ToArray();
File.WriteAllLines(fileName, source
.Select(item => string.Join(",", properties
.Select(property => property.GetValue(item)))));
}
Then use it:
List<Car> cars = new List<Car>();
...
SaveToFile(Cars, @"D:\WriteLines.txt");
solved Concatenate the properties of a List