Итак, если я вас правильно понял, вам дали 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). Это может быть грязно, но если это работает ...
И, очевидно, вы также жестко закодировали представление вашей результирующей строки.