将 C# 中的成员表达式 Func<T, object> 转换为 Func<T, bool> 的 MethodBinaryExpression。

3

在C#中,是否有可能将一个成员表达式和一个对象一起转换为方法二元表达式?

我迄今为止尝试过的:

public static void SaveBy<T>(this IDbConnection db, T obj, Expression<Func<T, object>> exp) where T : new()
{
    var com  = exp.Compile();
    if (db.Update(obj, e => exp == com.Invoke(obj)) <= 0)
    {
        db.Insert(obj);
    }
}

public static void UpdateBy<T>(this IDbConnection db, T obj, Expression<Func<T, bool>> exp) where T : new()
{
    db.Update(obj, exp);
}

我想要实现的是创建一个可以被调用的方法。

x.SaveBy(object,model=>model.property)

这将调用x.Update,将MemberExpression转换为MethodBinaryExpression,如下所示:

x.Update(object, model=>model.property == object.property);

半途而废的解决方案


public static void SaveBy<T>(this IDbConnection db, T obj, Expression<Func<T, object>> exp) where T : new()
    {
        var result = exp.Compile().Invoke(obj);
        var exp2 = Expression.Lambda<Func<T, bool>>(Expression.Equal(exp.Body, Expression.Constant(result)), exp.Parameters);
        if (db.Update(obj, exp2) <= 0)
        {
            db.Insert(obj);
        }
    }

你想从SaveBy中调用Update吗?“转换”是什么意思? - Sergii Zhevzhyk
是的,我想在SaveBy方法中调用Update。 - Joel Harkes
1个回答

1
你可以创建新的表达式。
model=>model.property == object.property

public static void SaveBy<T, TProp>(this IDbConnection db, T obj, Expression<Func<T, TProp>> exp) where T : new()
{
    var memberExp = (MemberExpression)exp.Body;
    var objPropExp = Expression.PropertyOrField(Expression.Constant(obj), memberExp.Member.Name);
    var equalExp = Expression.Equal(exp.Body, objPropExp);
    var exp2 = Expression.Lambda<Func<T, bool>>(equalExp, exp.Parameters);
    //exp2 = {model => (model.prop == value(object).prop)}

    if (db.Update(obj, exp2) <= 0)
    {
        db.Insert(obj);
    }
}

为什么要使用TProp泛型,似乎没有任何地方使用它?相比使用对象,它是否更好? - Joel Harkes
2
TProp被用于exp参数中,在您的情况下将是object - Rob
@joelharkes,正如Rob所说,应该使用_TProp_而不是_object_,这样你就可以得到真正的_MemberExpression_,而不是将表达式转换为对象。 - Grundy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接