动态获取 Func的结果调用
我正在尝试根据满足特定标准来序列化某些内容。
为此,我最初的希望是在对象的属性上使用包含 lambda 表达式的属性。
然而,由于这是不可能完成的,我已经决定使用 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。
那么,有人能指出我正确的方向吗?
I am trying to serialize something based upon meeting particular criteria.
To this end my original hope was to use attributes containing a lambda expression on an object's properties.
However, as this cannot be done I've settled for having a Func<T,bool> member within the class and passing the type (or first parameter type) and name of this Func through the property attribute. E.g.:
Func<SomeObject, bool> func = (p => p.Value == 4);
[FuncAtt(typeof(SomeObject), "func")]
public SomeObject PropertyName { get; set;}
In my serializer I need to call this Func<T, bool>.
Let's assume I have a Type t which is equal to typeof(SomeObject) in this case, or more abstractly, typeof(T). I can also get the Func<T,bool> itself, but only through reflection as an object.
My naive approach is something along these lines:
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 */
But this leads to the problem of casting a lambda to a delegate which is apparently erroneous.
I tried this in place of 'func':
(Expression)((Action)(() => func))
But that relies on func being a method call not a lambda.
So, can anyone point me in the right direction?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以执行类似的操作,无需表达式:
并获取值:
编辑以在不知道类型的情况下获取值:
You can just do something like this, without need for expressions:
and to get the value:
edit to get the value without knowing the type:
我认为您可以使用 lambda 表达式的 Compile 方法将其转换为委托。
这是我在 MSDN 上找到的:
在这里您可以找到它。
I think you can use Compile method of a lambda expression to cast it to a delegate.
here's what I found on MSDN:
Here you can find it.
不确定这是否有效,但就是这样:
现在您可以像这样调用“func”方法:
Not sure this is working sample, but this is the way:
now you can call the "func" method like this: