I don't understand what this achieves. If the DataSource is present, you return only this value, but if it isn't you return a string representation of al of the properties? 

From an API perspective, this is too confusing. Can we cleanup this code and be done with the hacks?