2012-07-12 21 views
2

我試圖使用下面的表達式調用將字符串轉換爲ToLower大小寫。Expression.Call用法

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}

+0

這是什麼語言?請用它標記問題 – Mark 2012-07-12 13:45:17

+0

你得到了什麼錯誤,或者出了什麼問題?我可以看到在'新的表達式[0]'的調用中沒有找到對象,但我猜這是一個錯字? – phg 2012-07-12 13:56:41

+0

您的問題沒有意義。甚至沒有一種正常的方法可以做到這一點。 – leppie 2012-07-12 13:56:47

回答

10

那麼沒有這樣的方法可以採用一種格式的日期字符串,並將其重新格式化爲另一種格式。您必須將該字符串轉換爲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"