【问题标题】:Generate lambda Expression By Clause using string.format in C#?在 C# 中使用 string.format 按子句生成 lambda 表达式?
【发布时间】:2010-03-10 14:18:21
【问题描述】:

我有一个通过子句生成表达式的方法,如下所示:

internal static Expression<Func<TModel, T>> GenExpressionByClause<TModel, T>(string column)
    {
        PropertyInfo columnPropInfo = typeof(TModel).GetProperty(column);

        var entityParam = Expression.Parameter(typeof(TModel), "e");                    // {e}
        var columnExpr = Expression.MakeMemberAccess(entityParam, columnPropInfo); // {e.column}
        var lambda = Expression.Lambda(columnExpr, entityParam) as Expression<Func<TModel, T>>; // {e => e.column}
        return lambda;

    }

所以我可以将 lambda 表达式构建为 e=&gt;e.column。 但我想将其更改为e=&gt;string.Format("{0}",e.column)。如何重构代码?

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    这应该可以完成工作:

        internal static Expression<Func<TModel, T>> GenExpressionByClause<TModel, T>(string column)
        {
            var columnPropInfo = typeof(TModel).GetProperty(column);
            var formatMethod = typeof (string).GetMethod("Format", new[] {typeof (string), typeof (object)});
    
            var entityParam = Expression.Parameter(typeof(TModel), "e");
            var columnExpr = Expression.MakeMemberAccess(entityParam, columnPropInfo);
            var formatCall = Expression.Call( formatMethod, Expression.Constant("{0}"), columnExpr);
            var lambda = Expression.Lambda(formatCall , entityParam) as Expression<Func<TModel, T>>;
            return lambda;
        }
    

    请注意,您可以将 Format MethodInfo 缓存在静态字段中。

    【讨论】:

      【解决方案2】:

      最终解决方案:

      internal static Expression<Func<TModel, string>> GenExpressionByClauseEx<TModel>(string column)
          {
              var columnPropInfo = typeof(TModel).GetProperty(column);
              var formatMethod = typeof(String).GetMethod("Format", new[] { typeof(string), typeof(Object) });
              //string.Format(
              var entityParam = Expression.Parameter(typeof(TModel), "e");
              var columnExpr = Expression.MakeMemberAccess(entityParam, columnPropInfo);
              var columnExprObj=Expression.Convert(columnExpr, typeof(object));
              var formatCall = Expression.Call(formatMethod, Expression.Constant("111--{0}"), columnExprObj);
              var lambda = Expression.Lambda(formatCall, entityParam) as Expression<Func<TModel, string>>;
              return lambda;
      
          }
      

      【讨论】:

      • @Sam - 您的最终解决方案最好作为对原始问题的更新。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多