我正在尝试根据特定条件序列化某些内容。
为此,我最初希望在对象的属性上使用包含lambda表达式的属性。
然而,由于这是不可能的,我已经决定在类中使用Func<T,bool>成员,并通过属性的类型(或第一个参数类型)和名称传递此Func。例如:
Func<SomeObject, bool> func = (p => p.Value == 4);
[FuncAtt(typeof(SomeObject), "func")]
public SomeObject PropertyName { get; set;}
在我的序列化程序中,我需要调用这个 Func。
假设在这种情况下,我有一个类型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 */
但是这会导致将lambda表达式转换为委托的问题,显然是错误的。
我尝试了在'func'的位置使用这个:
(Expression)((Action)(() => func))
但这取决于func是一个方法调用而不是lambda表达式。那么,有人能指点我方向吗?