Я пытаюсь сериализовать что-то на основе определенных критериев.
С этой целью я изначально надеялся использовать атрибуты, содержащие лямбда-выражение для свойств объекта.
Однако, поскольку это невозможно сделать, я решил иметь член Func ‹T, bool> внутри класса и передавать тип (или первый тип параметра) и имя этого Func через атрибут свойства. Например.:
Func<SomeObject, bool> func = (p => p.Value == 4);
[FuncAtt(typeof(SomeObject), "func")]
public SomeObject PropertyName { get; set;}
В моем сериализаторе мне нужно вызвать это Func ‹T, bool>.
Предположим, у меня есть Type t, который в данном случае равен typeof (SomeObject) или, более абстрактно, typeof (T). Я также могу получить сам Func ‹T, bool>, но только через отражение как объект.
Мой наивный подход звучит примерно так:
object func = typeof(MyClass).GetField(attribute.FuncName).GetValue(MyClassInstance);
Type funcType = typeof(Func<,>).MakeGenericType(attribute.Type, typeof(bool));
ParameterExpression p = Expression.Parameter(attribute.Type, objectToSerialize);
LambdaExpression l = Expression.Lambda(funcType, func, p); /* Won't work */
Но это приводит к проблеме приведения лямбды к делегату, что явно ошибочно.
Я пробовал это вместо func:
(Expression)((Action)(() => func))
Но это зависит от того, что func - это вызов метода, а не лямбда.
Итак, может ли кто-нибудь указать мне правильное направление?