Simple MVVM Walkthrough – Refactored–Part 2
In the previous post I showed an attempt to get rid of the magical strings. It worked great for a string property, but failed for the integer one as JR has reported. I decided to look into that, but this time around through TDD and this is what I found (besides the fact that going TDD way would definitely catch it).
When a string property is passed in, returned object is expected therefore there’s nothing complicated, it works. Though, when an integer (or any other type that is not a string) is passed in, .NET implicitly applies Convert() method.
Therefore the code should be update:
class PropertyOf<T> { public static string Resolve(Expression<Func<T, object>> expression) { Expression candidate = null;if (expression.Body is UnaryExpression) candidate = (expression.Body as UnaryExpression).Operand; if (expression.Body is MemberExpression) candidate = expression.Body; return (candidate as MemberExpression).Member.Name; }
}
Tests are quite simple:
[Observation] public void Should_return_integer_property_name_as_is_within_the_containing_class() { PropertyOf<Dummy>.Resolve(x => x.IntegerProperty).Should_Be_Equal_To("IntegerProperty"); }[Observation] public void Should_return_string_property_name_as_is_within_the_containing_class() { PropertyOf<Dummy>.Resolve(x => x.StringProperty).Should_Be_Equal_To("StringProperty"); } private class Dummy { public int IntegerProperty { get; set; } public string StringProperty { get; set; } }</pre></div>