Я пытаюсь сериализовать что-то на основе соответствия определенным критериям.
С этой целью моей первоначальной надеждой было использование атрибутов, содержащих лямбда-выражения в свойствах объекта.
Тем не менее, поскольку это не может быть сделано, я согласился на наличие в классе члена Func и передачу типа (или первого типа параметра) и имени этого Func через атрибут свойства. E.g.:
Func<SomeObject, bool> func = (p => p.Value == 4);
[FuncAtt(typeof(SomeObject), "func")]
public SomeObject PropertyName { get; set;}
В моем сериализаторе мне нужно вызвать этот Func .
Давайте предположим, что у меня есть Type t, который равен typeof (SomeObject) в этом случае, или, более абстрактно, typeof (T). Я также могу получить Func , но только через отражение как объект.
Мой наивный подход такой:
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 - это вызов метода, а не лямбда.
Итак, кто-нибудь может указать мне правильное направление?