gpt4 book ai didi

c# 动态调用方法与表达式树

转载 作者:行者123 更新时间:2023-11-30 12:26:30 26 4
gpt4 key购买 nike

我正在编写一个小表达式解析器并希望包含方法调用。语法类似于:functionName('stringValue',intValue)

然后,表达式解析器应使用正确的签名(在本例中为 string,int)查找名为“functionName”的静态函数

解析表达式没有问题,但我在调用right 方法时遇到问题。

到目前为止我想出的是一个简单的 Expression.Call:

Expression.Call(typeof(MyContext).GetMethod(functionName), parameterExpressions)

这可以很好地工作,以后可以编译成一个可调用的函数。但是当许多不同的重载、默认参数、params 关键字等发挥作用时,它会变得棘手。我不想重新实现重载解析的整个 C# 逻辑,并且认为 DLR 可以帮助我。

使用我可以写的动态关键字:

dynamic myC = MyContext;
return myC.functionName(param1, param2);

DLR 会找出要调用的函数重载。

问题是,我如何以编程方式实现这一点?

到目前为止我还没有成功

Expression.Dynamic(..)

最佳答案

只要您知道类型,GetMethod 就有一个重载可以为您执行重载解析。同样,Expression.Call() 也有一个采用方法名称和类型的重载。

// Assuming you have parameter expressions with known types...
string functionName = "functionName";
ParameterExpression param1 = Expression.Parameter(typeof(string), "stringValue");
ParameterExpression param2 = Expression.Parameter(typeof(int), "intValue");
var parameterExpressions = new ParameterExpression[] { param1, param2};

// Extract the types...
Type[] parameterTypes = parameterExpressions.Select(p => p.Type).ToArray();

// This will do the overload resolution and give you the methodInfo
MethodInfo methodToCall = typeof(Robot).GetMethod(
functionName,
parameterTypes);
Expression e = Expression.Call(methodToCall, parameterExpressions);

关于c# 动态调用方法与表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28505139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com