字符串的表达式树.IndexOf方法

本文关键字:IndexOf 方法 表达式 字符串 | 更新日期: 2023-09-27 18:05:54

如何构建string.IndexOf("substring", StringComparison.OrdinalIgnoreCase)的表达式树?

我可以让它工作没有第二个参数:StringComparison.OrdinalIgnoreCase。这些是我到目前为止的尝试:

var methodCall = typeof (string).GetMethod("IndexOf", new[] {typeof (string)});
Expression[] parms = new Expression[]{right, Expression.Constant("StringComparison.OrdinalIgnoreCase", typeof (Enum))};
var exp =  Expression.Call(left, methodCall, parms);
return exp;

也试过这个:

var methodCall = typeof (string).GetMethod(method, new[] {typeof (string)});
Expression[] parms = new Expression[]{right, Expression.Parameter(typeof(Enum) , "StringComparison.OrdinalIgnoreCase")};
var exp =  Expression.Call(left, methodCall, parms);
return exp;

请记住,如果我忽略OrdinalIgnoreCase参数,我可以让它工作。

谢谢

字符串的表达式树.IndexOf方法

我怀疑有两个问题。

第一个是你获取方法的方式——你要求获取一个只有一个字符串参数的方法,而不是一个有两个参数的方法:

var methodCall = typeof (string).GetMethod("IndexOf",
                            new[] { typeof (string), typeof(StringComparison) });

第二个是你给的 -它应该是常量的实际值,而不是字符串:

Expression[] parms = new Expression[] { right, 
    Expression.Constant(StringComparison.OrdinalIgnoreCase) };

编辑:这是一个完整的工作示例:

using System;
using System.Linq.Expressions;
class Test
{
    static void Main()
    {
        var method = typeof (string).GetMethod("IndexOf",
                new[] { typeof (string), typeof(StringComparison) });
        var left = Expression.Parameter(typeof(string), "left");
        var right = Expression.Parameter(typeof(string), "right");
        Expression[] parms = new Expression[] { right, 
                Expression.Constant(StringComparison.OrdinalIgnoreCase) };
        var call = Expression.Call(left, method, parms);
        var lambda = Expression.Lambda<Func<string, string, int>>
            (call, left, right);
        var compiled = lambda.Compile();
        Console.WriteLine(compiled.Invoke("hello THERE", "lo t"));
    }
}

最简单的方法是通过lambda获取:

//the compiler will convert the lambda into an expression
Expression<Func<string, string, int>> expression = (s1, s2) => s1.IndexOf(s2, StringComparison.OrdinalIgnoreCase);
//compile the expression so we can call it
var func = expression.Compile();
//outputs 2
Console.WriteLine(func("Case Sensitive", "se sensitive"));

这比手工构建表达式树可读性和可维护性要高得多。

我经常惊讶于很多人直接手工构建表达式树。当您可以让编译器为您完成工作时,就不需要这样做了。

我没有检查其余部分,但是如果只有enum出现问题:

Expression.Constant(StringComparison.OrdinalIgnoreCase)

Expression.Constant(Enum.Parse(typeof(StringComparison), "OrdinalIgnoreCase"), typeof(Enum));

你有更多的选择。或者在这里查看我的答案。

编辑:忘了加括号。