I have a class containing several properties (all are strings if it makes any difference).
I also have a list, which contains many different instances of the class.
You can loop through all non-indexed properties of an object like this:
var s = new MyObject();
foreach (var p in s.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) {
Console.WriteLine(p.GetValue(s, null));
}
Since GetProperties() returns indexers as well as simple properties, you need an additional filter before calling GetValue to know that it is safe to pass null as the second parameter.
You may need to modify the filter further in order to weed out write-only and otherwise inaccessible properties.