f.Substring(0, f.IndexOf(' '))"; 最终从传递的字符串中获取第一个单词。 将这个和平的字符串编-6ren">
gpt4 book ai didi

c# - 将字符串转换为函数

转载 作者:太空狗 更新时间:2023-10-29 22:14:25 25 4
gpt4 key购买 nike

我有一个简单的 lambda 作为字符串:

var str = "f => f.Substring(0, f.IndexOf(' '))";

最终从传递的字符串中获取第一个单词。

将这个和平的字符串编译/转换为 Func 并使以下代码起作用的最简单方法是什么。

Func<string, string> func = ...
var firstWord = func("Hello World");

Expression 对我有帮助吗?将欣赏工作样本,

谢谢

最佳答案

问题是这里没有强大的类型支持,所以你甚至不能使用表达式树。然而,DynamicLinq已经这样做了,所以你可以很容易地通过一些修改来实现它。只需在 DynamicExpression 类中创建一些您自己的静态方法即可添加此功能:

public static Expression<Func<T, S>> ParseLambda<T, S>(string expression)
{
string paramString = expression.Substring(0, expression.IndexOf("=>")).Trim();
string lambdaString = expression.Substring(expression.IndexOf("=>") + 2).Trim();
ParameterExpression param = Expression.Parameter(typeof(T), paramString);
return (Expression<Func<T,S>>)ParseLambda(new[] { param }, typeof(S), lambdaString, null);
}

public static LambdaExpression ParseLambda(string expression, Type returnType, params Type[] paramTypes)
{
string paramString = expression.Substring(0, expression.IndexOf("=>")).Trim("() ".ToCharArray());
string lambdaString = expression.Substring(expression.IndexOf("=>") + 2).Trim();
var paramList = paramString.Split(',');
if (paramList.Length != paramTypes.Length)
throw new ArgumentException("Specified number of lambda parameters do not match the number of parameter types!", "expression");

List<ParameterExpression> parameters = new List<ParameterExpression>();
for (int i = 0; i < paramList.Length; i++)
parameters.Add(Expression.Parameter(paramTypes[i], paramList[i].Trim()));

return ParseLambda(parameters.ToArray(), returnType, lambdaString, null);
}

两者的用法:

Func<string, string> func = DynamicExpression.ParseLambda<string, string>("f => f.Substring(0, f.IndexOf(\" \"))").Compile();

Func<string, int, string> otherFunc = ((Expression<Func<string, int, string>>)DynamicExpression.ParseLambda("(str, ind) => (ind * 100).ToString() + str")).Compile();

编辑:这还没有经过全面测试,因此您可能希望通过一些单元测试来确保它们产生正确的结果。我没有做任何过于复杂的事情,只是明确声明要在 public static LambdaExpression ParseLambda(ParameterExpression[] parameters, Type resultType, string expression, params object[] values) 方法中使用的参数。< br/>还通过在创建 ParameterExpression 时从 paramList 修剪参数名称来修复@Mauro Destro 指出的错误。

关于c# - 将字符串转换为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10655761/

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