我将简单的lambda作为字符串:
var str = "f => f.Substring(0, f.IndexOf(' '))";
哪个eventualy从传递的字符串中获取第一个单词。
将此字符串编译/转换为Func并使以下代码生效的最简单方法是什么。
Func<string, string> func = ...
var firstWord = func("Hello World");
表达能帮助我吗?将欣赏工作样本,
由于
答案 0 :(得分:11)
问题是这里没有强大的输入支持,所以你甚至无法使用表达式树。但是,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)
方法中使用的参数
还修复了@Mauro Destro在创建paramList
时修改ParameterExpression
的参数名称时发现的错误。
答案 1 :(得分:1)
您需要检查字符串并从提供的字符串构造表达式。没有 easy 或内置方法来从这样的字符串中获取方法。
祝你好运。答案 2 :(得分:1)
您可以使用Roslyn脚本执行此操作。例如:
var str = "f => f.Substring(0, f.IndexOf(' '))";
var func = await CSharpScript.EvaluateAsync<Func<string, string>>(str);
var firstWord = func("Hello World");
这需要Microsoft.CodeAnalysis.CSharp.Scripting
包。
答案 3 :(得分:0)
您可能对CodeDom技术感兴趣。 link
但那里没有现成的解析器。