2016-01-19 83 views
2

我新的表達式樹,我需要轉換的下面拉姆達表達式樹在表達式中使用ToString方法在第一樹

Data.Where(s => s.Property.ToString().StartsWith("My Search Data")); 

但是我已經高達

Data.Where(s => s.Property.StartsWith("My Search Data"); 

做現在我在使用StartsWith之前需要使用ToString方法。

以下是我的示例代碼。

ParameterExpression e = Expression.Parameter(typeof(T), "e"); 
PropertyInfo propertyInfo = typeof(T).GetProperty(field); 
MemberExpression m = Expression.MakeMemberAccess(e, propertyInfo); 
ConstantExpression c = Expression.Constant(data, typeof(string)); 
MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }); 
Expression call = Expression.Call(m, mi, c); 
Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(call, e); 
query = query.Where(lambda); 

回答

2

IDEA是你必須從System.Object中獲取「ToString」方法。由於它是一種虛擬方法,因此運行時可以調用您的真實對象。

注意:IData是您擁有名爲「Property」的屬性的任何數據。

ParameterExpression e = Expression.Parameter(typeof(IData), "e"); 
PropertyInfo propertyInfo = typeof(IData).GetProperty("Property"); 
MemberExpression m = Expression.MakeMemberAccess(e, propertyInfo); 

var toString = typeof (Object).GetMethod("ToString"); 

ConstantExpression c = Expression.Constant(data, typeof(string)); 
MethodInfo mi = typeof(string).GetMethod("StartsWith", new Type[] { typeof(string) }); 

var toStringValue = Expression.Call(m, toString); 

Expression call = Expression.Call(toStringValue, mi, c); 

Expression<Func<IData, bool>> lambda = Expression.Lambda<Func<IData, bool>>(call, e); 
+0

工作完美。真的非常感謝我的內心深處。你能否建議我爲Expression Tree寫一本好書 –

+1

在我看來,你必須先學習.NET的第一反思和東西。爲此,我會推薦Jeffrey Richter的「CLR via C#」。接下來,你可以嘗試開始玩他們(我學會了他們,直到通過在家裏玩Expression API來掌握他們)。作爲練習,嘗試獲取任何函數(不管是什麼,但從簡單的開始),並嘗試將其轉換爲表達式樹(或至少其中的一部分)。做這個翻譯,直到你掌握它們。 –

+0

或者查看反編譯的代碼,看看編譯器如何將您的lambda表達式轉換爲表達式API – MBoros

2

請考慮使用允許您通過名稱訪問成員的重載。這將使這件事更容易做到。

// Data.Where(s => s.Property.ToString().StartsWith("My Search Data")); 
var property = "Property"; 
var filter = "My Search Data"; 
var param = Expression.Parameter(typeof(T)); 
var body = Expression.Call(
    Expression.Call(
     Expression.Property(param, property), 
     "ToString", 
     null 
    ), 
    "StartsWith", 
    null, 
    Expression.Constant(filter) 
); 
var lambda = Expression.Lambda<Func<T, bool>>(body, param); 
+0

它工作正常。儘管第一個答案已經解決了我的問題,但您已經提供了一種解決方案。謝謝 :) –

相關問題