Предикат функции для строки - PullRequest
0 голосов
/ 13 сентября 2018

Мое изучение выражения действительно простое, у меня есть следующий предикат функции

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 ]

0 голосов
/ 13 сентября 2018

Итак, если я вас правильно понял, вам дали 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"))

Здесь вы немного размышляете, чтобы получить параметры (и знаете, , что их всегда 1) для вашего функции для сравнения. И вы ищете свойства этого параметра на основе имени.

Существует также небольшой трюк с dynamic для получения значения rec (ваша RecordViewModel). Это может быть грязно, но если это работает ...

И, очевидно, вы также жестко закодировали представление вашей результирующей строки.

0 голосов
/ 13 сентября 2018

Если вы хотите вернуть строку, это должно быть ваше выражение:

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" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...