有没有一种方法可以在表达式树中设置“ DeclaringType”?

日落任务

我正在执行Func- > Expression- > Func转换。如果我从方法(下面的第一个示例)创建Func <>(),它会很好地工作,但是,如果我使用表达式树(第二个示例)创建函数,则在访问func2.Method.DeclaringType.FullName会失败,并出现NullReferenceException这是因为DeclaringType为null。(NJection使用反射,所以我认为这就是为什么它需要DeclaringType的原因。)

如何为通过编译表达式树创建的Func <>填充DeclaringType类型?(也许不可能吗?)在第一个示例中设置了DeclaringType。

从方法中使用Func <>(效果很好)

// Build a Func<> 
Func<int, int> add = Add;
// Convert it to an Expression using NJection Library
Expression<Func<int, int>> expr = ToExpr<Func<int, int>>(add);
// Convert it back to a Func<>
Func < int, int> func = expr.Compile();
// Run the Func<>
int result = func(100);

使用表达式树(不起作用)...

// Build a Func<> using an Expression Tree
ParameterExpression numParam = Expression.Parameter(typeof(int));
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numAddFive = Expression.Add(numParam, five);
Func<int, int> func2 = 
    Expression.Lambda<Func<int, int>>(
        numAddFive, 
        new ParameterExpression[] { numParam }).Compile();
// Convert to an Expression using NJection (EXCEPTION ON NEXT LINE)
// ToExpr is trying to access func2.Method.DeclaringType.FullName(DeclaringType is null)
Expression<Func<int, int>> exp2 = ToExpr<Func<int, int>>(func2);
// Convert it back to a Func<>
Func<int, int> func2b = exp2.Compile();
// Run the Func<>
int result2 = func2b(100);
喇叭

我不知道NJection库的用途是什么,因为他们的网站已经关闭并且Codeplex没有可用的源代码。

如果只需要获取一个Expression可以编译回该函数的函数,则可以自己创建它。例如:

static Expression<T> ToExpr<T>(T func)
{
    var type = typeof(T);
    var method = type.GetMethod("Invoke"); // Delegate.Invoke() has parameters types matching delegate parameters types
    var pars = method.GetParameters()
        .Select(pi => Expression.Parameter(pi.ParameterType))
        .ToArray();

    return Expression.Lambda<T>(
        Expression.Call(Expression.Constant(func), method, pars),
        pars
    );
}

这样ToExpr,您上面的代码即可编译并运行而不会出现问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以在JavaScript需要表达式的地方包含“ var”列表?

来自分类Dev

有没有一种方法可以取出表达以便在各种混合中重用(例如函数)?

来自分类Dev

有没有一种方法可以从单个列表理解表达式输出多个列表?

来自分类Dev

有没有一种方法可以让iOS的自动更正忽略UITextView中的单个单词或正则表达式?

来自分类Dev

有没有一种方法可以定义将表达式(即int)转换为String文字的宏?

来自分类Dev

有没有一种方法可以在不使用组的情况下引用re.sub中的整个匹配表达式?

来自分类Dev

ILogger.Log方法的declaringType参数

来自分类Dev

PropertyInfo.DeclaringType真的可以为null吗?

来自分类Dev

Python中有没有一种方法可以创建在正则表达式中匹配的组件的元组?

来自分类Dev

有没有一种方法可以只替换Java匹配器正则表达式中的一个捕获组?

来自分类Dev

有没有一种方法可以根据以前的捕获组(而不是以前捕获的)来匹配正则表达式?

来自分类Dev

有没有一种方法可以在XFCE中设置通知的主题?

来自分类Dev

有没有一种方法可以使用C#8开关表达式来返回字符串值?

来自分类Dev

有没有一种方法可以使用Scala编译器对布尔表达式进行类型检查?

来自分类Dev

有没有一种方法可以简化正则表达式匹配字符?

来自分类Dev

正则表达式中有没有一种方法可以检查某个单词是否在定义的两个位置之一中出现在字符串中?

来自分类Dev

有没有一种方法可以将动态JSON保存到Mobx状态树中?

来自分类Dev

有没有一种方法可以使此Regex表达式不那么贪婪。使用Excel VBA

来自分类Dev

有没有一种方法可以输出表达式而无需评估jupyter notebook

来自分类Dev

有没有一种方法可以在XFCE中设置通知的主题?

来自分类Dev

有没有一种方法可以在Lotusscript中设置字段类型

来自分类Dev

有没有一种方法可以从单个列表理解表达式输出多个列表?

来自分类Dev

有没有一种方法可以将“播放/暂停”设置在同一按钮中?

来自分类Dev

有没有一种方法可以使用lambda表达式在NameValueCollection中查找非空值

来自分类Dev

有没有一种方法可以从霍夫曼树中还原频率阵列?

来自分类Dev

有没有一种方法可以在Python 2中使用带有正则表达式的memoryview?

来自分类Dev

Xcode:有没有一种方法可以在断点中定义的表达式中搜索字符串?

来自分类Dev

有没有一种方法可以形成此正则表达式,以使可选组不会出现在匹配组中?

来自分类Dev

有没有一种方法可以根据以前的捕获组(而不是以前捕获的)来匹配正则表达式?

Related 相关文章

  1. 1

    有没有一种方法可以在JavaScript需要表达式的地方包含“ var”列表?

  2. 2

    有没有一种方法可以取出表达以便在各种混合中重用(例如函数)?

  3. 3

    有没有一种方法可以从单个列表理解表达式输出多个列表?

  4. 4

    有没有一种方法可以让iOS的自动更正忽略UITextView中的单个单词或正则表达式?

  5. 5

    有没有一种方法可以定义将表达式(即int)转换为String文字的宏?

  6. 6

    有没有一种方法可以在不使用组的情况下引用re.sub中的整个匹配表达式?

  7. 7

    ILogger.Log方法的declaringType参数

  8. 8

    PropertyInfo.DeclaringType真的可以为null吗?

  9. 9

    Python中有没有一种方法可以创建在正则表达式中匹配的组件的元组?

  10. 10

    有没有一种方法可以只替换Java匹配器正则表达式中的一个捕获组?

  11. 11

    有没有一种方法可以根据以前的捕获组(而不是以前捕获的)来匹配正则表达式?

  12. 12

    有没有一种方法可以在XFCE中设置通知的主题?

  13. 13

    有没有一种方法可以使用C#8开关表达式来返回字符串值?

  14. 14

    有没有一种方法可以使用Scala编译器对布尔表达式进行类型检查?

  15. 15

    有没有一种方法可以简化正则表达式匹配字符?

  16. 16

    正则表达式中有没有一种方法可以检查某个单词是否在定义的两个位置之一中出现在字符串中?

  17. 17

    有没有一种方法可以将动态JSON保存到Mobx状态树中?

  18. 18

    有没有一种方法可以使此Regex表达式不那么贪婪。使用Excel VBA

  19. 19

    有没有一种方法可以输出表达式而无需评估jupyter notebook

  20. 20

    有没有一种方法可以在XFCE中设置通知的主题?

  21. 21

    有没有一种方法可以在Lotusscript中设置字段类型

  22. 22

    有没有一种方法可以从单个列表理解表达式输出多个列表?

  23. 23

    有没有一种方法可以将“播放/暂停”设置在同一按钮中?

  24. 24

    有没有一种方法可以使用lambda表达式在NameValueCollection中查找非空值

  25. 25

    有没有一种方法可以从霍夫曼树中还原频率阵列?

  26. 26

    有没有一种方法可以在Python 2中使用带有正则表达式的memoryview?

  27. 27

    Xcode:有没有一种方法可以在断点中定义的表达式中搜索字符串?

  28. 28

    有没有一种方法可以形成此正则表达式,以使可选组不会出现在匹配组中?

  29. 29

    有没有一种方法可以根据以前的捕获组(而不是以前捕获的)来匹配正则表达式?

热门标签

归档