I am trying to make a method that will go through a list of generic objects and replace all their properties of type string
which is either null
or empty with a replacement.
How is a good way to do this?
I have this kind of... shell... so far:
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement) { var properties = typeof(T).GetProperties( -- What BindingFlags? -- ); foreach(var p in properties) { foreach(var item in list) { if(string.IsNullOrEmpty((string) p.GetValue(item, null))) p.SetValue(item, replacement, null); } } }
So, how do I find all the properties of a type that are:
Of type string
Has public get
Has public set
?
I made this test class:
class TestSubject { public string Public; private string Private; public string PublicPublic { get; set; } public string PublicPrivate { get; private set; } public string PrivatePublic { private get; set; } private string PrivatePrivate { get; set; } }
The following does not work:
var properties = typeof(TestSubject) .GetProperties(BindingFlags.Instance|BindingFlags.Public) .Where(ø => ø.CanRead && ø.CanWrite) .Where(ø => ø.PropertyType == typeof(string));
If I print out the Name of those properties I get there, I get:
PublicPublic PublicPrivate PrivatePublic
In other words, I get two properties too much.
Note: This could probably be done in a better way... using nested foreach and reflection and all here... but if you have any great alternative ideas, please let me know cause I want to learn!
Your code rewritten. Does not use LINQ nor var.
public static void ReplaceEmptyStrings<T>(List<T> list, string replacement) { PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo p in properties) { // Only work with strings if (p.PropertyType != typeof(string)) { continue; } // If not writable then cannot null it; if not readable then cannot check it's value if (!p.CanWrite || !p.CanRead) { continue; } MethodInfo mget = p.GetGetMethod(false); MethodInfo mset = p.GetSetMethod(false); // Get and set methods have to be public if (mget == null) { continue; } if (mset == null) { continue; } foreach (T item in list) { if (string.IsNullOrEmpty((string)p.GetValue(item, null))) { p.SetValue(item, replacement, 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