如何从 IronPython 将 Expression<Action> 传递给 C# 函数

How to pass Expression<Action> to a C# function from IronPython

给定如下 C# 函数,在 IronPython 中调用它的有效语法是什么?

public void MyFunction( Expression<Action> foo)
{

}

您只需要构造一个符合该模式的表达式。在表达式库中,通用表达式是专门的 lambda 表达式。因此,您只需在 IronPython 中编写适当的 lambda 表达式即可。不幸的是,您不会像在 C# 中那样获得任何编译器帮助,您必须手动构建它。

幸运的是,dlr 会非常宽容,并会在可能的情况下为您推断一些类型。

给定一个库 SomeLibrary.dll,给定 class:

using System;
using System.Linq.Expressions;

namespace SomeNamespace
{
    public class SomeClass
    {
        public void SomeMethod(Expression<Action> expr) => Console.WriteLine(expr);
    }
}
import clr

clr.AddReference('System.Core')
clr.AddReference('SomeLibrary')

from System import Console, Array, Type, Action
from System.Linq.Expressions import *
from SomeNamespace import SomeClass

# build the expression
expr = Expression.Lambda(
    Expression.Call(
        clr.GetClrType(Console).GetMethod('WriteLine', Array[Type]([str])),
        Expression.Constant('Hello World')
    )
)

# technically, the type of expr is Expression as far as C# is concerned
# but it happens to be an instance of Expression<Action> which the dlr will make work
SomeClass().SomeMethod(expr)