如何从 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)
给定如下 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)