public void ConstructFieldOrPropertySetterFixture() { var action = ReflectionExtensions.ConstructFieldOrPropertySetter <ObjectWithProperties, int>("Property4"); var obj = new ObjectWithProperties(); obj.Property4 = 5; action(obj, 2); obj.Property4.Should().Equal(2); }
//public static Expression GetForeinKeyValue<T, TProperty>(Expression<Func<T, TProperty>> property) //{ // var type = typeof(T); // var keyName = type.GetRuntimeProperty(typeof(TProperty).Name).GetCustomAttribute<ForeignKeyAttribute>().Name; // MemberExpression getter = ReflectionExtensions.ConstructFieldOrPropertyGetter(Expression.Parameter(type), keyName); // return null; //} public static Expression <Func <T, TProperty, bool> > GetForeinKeyPredicate <T, TProperty>(Expression <Func <T, TProperty> > path, out Action <T, TProperty> setter) { var type = typeof(T); var typeProperty = typeof(TProperty); var foreignKeyEntityMember = ((MemberExpression)path.Body).Member; var keyName = foreignKeyEntityMember.CustomAttributes.First(attrData => attrData.AttributeType == typeof(ForeignKeyAttribute)).ConstructorArguments[0].Value.ToString(); var baseEntityParameter = Expression.Parameter(type, "TBaseEntity"); var foreignEntityParameter = Expression.Parameter(typeProperty, "TForeignEntity"); MemberExpression foreignKeyGetter = ReflectionExtensions.ConstructFieldOrPropertyGetter(baseEntityParameter, keyName); MemberExpression primaryKeyGetter = ReflectionExtensions.ConstructFieldOrPropertyGetter(foreignEntityParameter, keyName); var binary = Expression.Equal(foreignKeyGetter, primaryKeyGetter); setter = ReflectionExtensions.ConstructFieldOrPropertySetter <T, TProperty>(foreignKeyEntityMember.Name); return(Expression.Lambda <Func <T, TProperty, bool> >(binary, baseEntityParameter, foreignEntityParameter)); }