【问题标题】:C# Member expression Func<T,object> to a Func<T,bool> MethodBinaryExpressionC# 成员表达式 Func<T,object> 到 Func<T,bool> MethodBinaryExpression
【发布时间】:2015-12-03 13:11:20
【问题描述】:

是否可以将成员表达式与对象一起转换为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 吗?你所说的“转换”是什么意思?
  • 是的,我想在 SaveBy 方法中调用 Update

标签: c# lambda expression servicestack


【解决方案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 泛型,它似乎没有在任何地方使用?比使用对象更好吗?
  • TProp 用于exp 参数,在您的情况下为object
  • @joelharkes,正如 Rob 所说,TProp 使用了 object,因此您可以获得真正的 MemberExpression,而不是表达式转换为对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多