Created
April 19, 2017 22:49
-
-
Save HakanL/95fa3f8f7313ef563b9c0e7afca50ef1 to your computer and use it in GitHub Desktop.
Property setting for Data Model/Business Object transformations with dirty/modified tracking
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Linq.Expressions; | |
using System.Reflection; | |
namespace Haukcode.DataAccess.Util | |
{ | |
internal static class PropertyHelper | |
{ | |
public static void Set<T, TProp>(T target, Expression<Func<T, TProp>> memberLamda, TProp sourceValue, ref bool isDirty) | |
{ | |
Set(target, memberLamda, sourceValue, (a, b) => | |
{ | |
if (b == null && a == null) | |
return true; | |
if ((b == null && a != null) || !b.Equals(a)) | |
return false; | |
return true; | |
}, ref isDirty); | |
} | |
public static void Set<T, TProp>(T target, Expression<Func<T, TProp>> memberLamda, TProp sourceValue, Func<TProp, TProp, bool> comparer, ref bool isDirty) | |
{ | |
var memberSelectorExpression = memberLamda.Body as MemberExpression; | |
if (memberSelectorExpression != null) | |
{ | |
var property = memberSelectorExpression.Member as PropertyInfo; | |
if (property != null) | |
{ | |
var targetValue = (TProp)property.GetValue(target); | |
if (!comparer(sourceValue, targetValue)) | |
{ | |
// Changed | |
property.SetValue(target, sourceValue, null); | |
isDirty = true; | |
} | |
} | |
else | |
throw new ArgumentException("Invalid property type"); | |
} | |
else | |
throw new ArgumentException("Invalid property"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment