首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态获取Func<T、bool>调用的结果

动态获取Func<T、bool>调用的结果
EN

Stack Overflow用户
提问于 2009-09-14 04:04:39
回答 3查看 3K关注 0票数 3

我正在尝试根据满足特定的标准来序列化一些东西。

为此,我最初的希望是在对象的属性上使用包含lambda表达式的属性。

然而,由于无法做到这一点,我决定在类中拥有一个Func成员,并通过property属性传递此Func的类型(或第一个参数类型)和名称。例如:

代码语言:javascript
运行
复制
Func<SomeObject, bool> func = (p => p.Value == 4);
[FuncAtt(typeof(SomeObject), "func")]
public SomeObject PropertyName { get; set;}

在我的序列化程序中,我需要调用这个Func。

假设我有一个类型t,它等于本例中的typeof(SomeObject),或者更抽象地说,typeof(T)。我也可以获取Func本身,但只能通过反射作为对象。

我的天真方法是这样的:

代码语言:javascript
运行
复制
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':

代码语言:javascript
运行
复制
(Expression)((Action)(() => func))

但这依赖于func是一个方法调用,而不是lambda。

那么,谁能给我指个正确的方向?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-14 07:42:40

你可以这样做,不需要表达式:

代码语言:javascript
运行
复制
public static class Test
{
    public static Predicate<int> func = s => s > 20;
}

并获取该值:

代码语言:javascript
运行
复制
    private void Form1_Load(object sender, EventArgs e)
    {
        var a = typeof(Test).GetField("func");

        bool validates = ((Predicate<int>)a.GetValue(null)).Invoke(100);
    }

在不知道类型的情况下编辑以获取值:

代码语言:javascript
运行
复制
bool validates = (bool)((Delegate)a.GetValue(null)).DynamicInvoke(100);
票数 4
EN

Stack Overflow用户

发布于 2009-09-14 04:18:16

我认为您可以使用lambda表达式的Compile方法将其转换为委托。

这是我在MSDN上找到的:

Expression<(Of <(TDelegate>)>)类型提供了

方法,该方法将表达式树表示的代码编译为可执行委托。此可执行代码等同于最初将lambda表达式分配给委托类型时生成的可执行代码。

Here你可以找到它。

票数 1
EN

Stack Overflow用户

发布于 2009-09-14 08:38:16

我不确定这是工作样本,但这是正确的方式:

代码语言:javascript
运行
复制
// not sure what are you doing in this line, but assume it should return
// a method name specified in the attribute, e.g. "func" in your example.
// Also "func" must be a method (static one in my example) of SomeObject class
String funcname = typeof(MyClass).GetField(attribute.FuncName).GetValue(MyClassInstance);
ParameterExpression param = Expression.Parameter(typeof(SomeObject), "p");
MethodCallExpression call = Expression.Call(SomeObject, funcname, new Type[] { typeof(SomeObject), typeof(Boolean) }, param);
LambdaExpression lambda = Expression.Lambda<Func<SomeObject, Boolean>>(call, param);

现在你可以像这样调用"func“方法:

代码语言:javascript
运行
复制
Boolean result = lambda.Compile()(SomeObjectInstance);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1419630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档