【问题标题】:Expression.Call usageExpression.Call 用法
【发布时间】:2012-07-12 22:21:33
【问题描述】:

我已尝试使用以下表达式调用将字符串转换为 ToLower 大小写。

var tolowerMethod = typeof(string).GetMethods().Where(m => m.Name == "ToString").FirstOrDefault(); 
var toLowerMethodCall = Expression.Call(memExp,tolowerMethod,new Expression[0]);

我在创建表达式调用以格式化如下值时遇到了一些问题:"05/12/2012 12:00:00"{0:MM/dd/yyyy}

【问题讨论】:

  • 这是什么语言??请用它标记问题
  • 您遇到了什么错误,或者出了什么问题?我可以看到new Expression[0] 的调用中缺少括号,但我想这是一个错字?
  • 您的问题没有意义。甚至没有一种正常的方法可以做到这一点。
  • 您的问题说您要将字符串转换为小写,然后实际代码使用ToString,然后您的最后一段说您要格式化DateTime。你到底想要什么?

标签: c# expression-trees


【解决方案1】:

没有这样的方法可以采用一种格式的日期字符串并将其重新格式化为另一种格式。您必须将该字符串转换为 DateTime,然后再转换回 string

创建这样一个 lambda 的方法如下:

var dateStr = Expression.Parameter(typeof(string));
var asDateTime = Expression.Call(typeof(DateTime), "Parse", null, dateStr); // calls static method "DateTime.Parse"
var fmtExpr = Expression.Constant("MM/dd/yyyy");
var body = Expression.Call(asDateTime, "ToString", null, fmtExpr); // calls instance method "DateTime.ToString(string)"
var lambdaExpr = Expression.Lambda<Func<string, string>>(body, dateStr);

然后编译并调用它。

var method = lambdaExpr.Compile();
method("05/12/2012 12:00:00"); // "05/12/2012"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多