2 回答

TA貢獻1862條經(jīng)驗 獲得超6個贊
所以,如果我對你的理解正確,你會得到一個Func(在你的例子中稱為 exp),你需要為它提供一個 toString 方法。
你可以使用這樣的東西:
Func<Func<ReportModel, bool>, string> toString = func =>
{
var vm = ((dynamic)func.Target).rec;
var paramType = func.Method.GetParameters()[0].ParameterType;
var firstNameProperty = paramType.GetProperties().First(p => p.Name == nameof(vm.Firstname)).Name;
var surnameProperty = paramType.GetProperties().First(p => p.Name == nameof(vm.Surname)).Name;
return $"(({paramType.Name}.{firstNameProperty} == \"{vm.Firstname}\") AndAlso ({paramType.Name}.{surnameProperty} == \"{vm.Surname}\"))";
};
Console.WriteLine(toString(exp(viewModel)));
//returns ((ReportModel.Firstname == "Peter") AndAlso (ReportModel.Surname == "Jones"))
在那里,您使用一些反射來獲取 func 的參數(shù)(并且您知道它們總是有 1 個)來進行比較。然后根據(jù)名稱查找該參數(shù)的屬性。
還有一個小技巧dynamic可以獲取rec值(您的 RecordViewModel)。它可能很臟,但如果它有效......
而且,顯然,您還對結(jié)果字符串的表示進行了硬編碼。

TA貢獻2080條經(jīng)驗 獲得超4個贊
如果你想返回一個字符串,這應(yīng)該是你的表達式:
Func<RecordViewModel, string> exp = rec (x) => return x.Firstname == rec.Firstname &&
x.Surname == rec.Surname ? "ReportModel.Firstname" + x.Firstname + " "
+ "ReportModel.Surname" + " " rec.Surname : string.empty;
然后你可以通過傳入模型來調(diào)用表達式:
var func = exp(new RecordViewModel() { Firstname= "Peter", Surname = "Jones" });
- 2 回答
- 0 關(guān)注
- 169 瀏覽
添加回答
舉報