c# 表达式树:调用带有输出参数的方法?

c# Expression tree: call method with out-parameter?

例如:我想调用

Int32.TryParse(String numberStr, out Int32 result)

Expression tree中,但不知道如何得到解析的结果。

结果存储在变量 result 中(正如您在 out 参数中命名的那样)。 Try parse 尝试解析您的输入,如果成功,它 returns true 并将结果值放入命名的 out 参数中。否则,它 returns false 并且输出参数无效。你会像这样使用它。

if (Int32.TryParse(String numberStr, out Int32 result)) {
    // do something with `result`
}

// something went wrong (failure state - maybe with an `else`?)

你能用下划线“_”试试吗

List<string> lstNumbs = new List<string>() {"f", "d", "7", "4", "5", "4", "2"};

var result = lstNumbs.Where(c => Int32.TryParse(c, out int _)).Select(s => s);

foreach (var item in result)
{
    Console.WriteLine(item);
}

演示:https://dotnetfiddle.net/GdbgIZ

在使用表达式时调用采用 out 参数的方法无需执行任何特殊操作:只需将其视为任何其他参数,运行时会处理它。

下面是执行类似操作的示例:

void Lambda(string input)
{
    int parsed;
    int.TryParse(input, out parsed);
    Console.WriteLine("Parsed: {0}", (object)parsed);
}

使用表达式:

public static void Main()
{
    var inputParam = Expression.Parameter(typeof(string), "input");
    var parsedVar = Expression.Variable(typeof(int), "parsed");

    var tryParseCall = Expression.Call(
        typeof(int),
        "TryParse",
        null,
        inputParam,
        parsedVar); // <-- Here we pass 'parsedVar' as the 'out' parameter

    var writeLineCall = Expression.Call(
        typeof(Console),
        "WriteLine",
        null,
        Expression.Constant("Parsed: {0}"),
        Expression.Convert(parsedVar, typeof(object)));

    var lambda = Expression.Lambda<Action<string>>(
        Expression.Block(
            new[] { parsedVar },
            tryParseCall,
            writeLineCall),
        inputParam);

    var compiled = lambda.Compile();
    compiled("3");
}

See it working on dotnetfiddle