为了账号安全,请及时绑定邮箱和手机立即绑定

函数谓词到字符串

函数谓词到字符串

C#
红颜莎娜 2022-01-15 15:45:01
我的表达学习真的很基础,我有以下函数谓词Func<RecordViewModel, Func<ReportModel, bool>> exp = rec => x => x.Firstname == rec.Firstname &&                                                                 x.Surname == rec.Surname;var func = exp(new RecordViewModel() { Firstname= "Peter", Surname  = "Jones" });以下是我的模型和视图模型,public class ReportModel{    public string Firstname { get; set; }    public string Surname { get; set; }}public class RecordViewModel{    public string Firstname { get; set; }    public string Surname { get; set; }}我想让表达式序列化为 ((ReportModel.Firstname == "Peter") AndAlso (ReportModel.Surname == "Jones"))。非常感谢任何帮助,
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超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 的参数(并且您知道它们总是有 1 个)来进行比较。然后根据名称查找该参数的属性。


还有一个小技巧dynamic可以获取rec值(您的 RecordViewModel)。它可能很脏,但如果它有效......


而且,显然,您还对结果字符串的表示进行了硬编码。


查看完整回答
反对 回复 2022-01-15
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

如果你想返回一个字符串,这应该是你的表达式:


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;

然后你可以通过传入模型来调用表达式:


var func = exp(new RecordViewModel() { Firstname= "Peter", Surname  = "Jones" });


查看完整回答
反对 回复 2022-01-15
  • 2 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号