Let's say I have many objects and they have many string properties.
Is there a programatic way to go through them and output the propertyname and its value or does it have to be hard coded?
Is there maybe a LINQ way to query an object's properties of type 'string' and to output them?
Do you have to hard code the property names you want to echo?
Use reflection. It's nowhere near as fast as hardcoded property access, but it does what you want.
The following query generates an anonymous type with Name and Value properties for each string-typed property in the object 'myObject':
var stringPropertyNamesAndValues = myObject.GetType()
.GetProperties()
.Where(pi => pi.PropertyType == typeof(string) && pi.GetGetMethod() != null)
.Select(pi => new
{
Name = pi.Name,
Value = pi.GetGetMethod().Invoke(myObject, null)
});
Usage:
foreach (var pair in stringPropertyNamesAndValues)
{
Console.WriteLine("Name: {0}", pair.Name);
Console.WriteLine("Value: {0}", pair.Value);
}
You can get all the properties of a type by using the GetProperties
method. You can then filter this list using the LINQ Where
extension method. Finally you can project the properties using the LINQ Select
extension method or a convenient shortcut like ToDictionary
.
If you want to limit the enumeration to properties having of type String
you can use this code:
IDictionary<String, String> dictionary = myObject.GetType()
.GetProperties()
.Where(p => p.CanRead && p.PropertyType == typeof(String))
.ToDictionary(p => p.Name, p => (String) p.GetValue(myObject, null));
This will create a dictionary that maps property names to property values. As the property type is limited to String
it is safe to cast the property value to String
and the type of the returned type is IDictionary<String, String>
.
If you instead want all properties you can do it like this:
IDictionary<String, Object> dictionary = myObject.GetType()
.GetProperties()
.Where(p => p.CanRead)
.ToDictionary(p => p.Name, p => p.GetValue(myObject, null));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With