コード例 #1
0
        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);
        }
コード例 #2
0
        //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));
        }