f.Substring(0, f.IndexOf(' '))"; which ultimately takes th...">

Convert string to function

I have a simple lambda as a string:

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

which ultimately takes the first word from the passed string.

What is the easiest way to compile / convert this string world to Func and make the following code work.

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

Will the expression help me? Understand the working pattern,

thank

+3
source share
4 answers

You will need to examine the string and build the expression from the provided string. There is no simple or built-in method to get a method from such a string.

Good luck.

+2
source

, , . 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.

+11

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.

+1

CodeDom.

.

0
source

All Articles