3

以下のコードは動作しますStartsWithContains、試してみると、次のEquals例外が発生します。タイプ 'System.String' の複数のメソッド 'Equals' は、指定された引数と互換性があります

再開するには、CreatePredicate は 3 種類の述語を作成できますが、Equals機能しないのは だけです。

  • AList.Where(x => x.MyField.StartsWith("ValueToSearch")); //OK
  • AList.Where(x => x.MyField.Contains("ValueToSearch")); //OK
  • AList.Where(x => x.MyField.Equals("ValueToSearch")); //Not OK

..

public enum TypeSearch
        {
            StartsWith = 1,
            Contains = 2,
            Equals = 3
        }

    private static Expression<Func<T, bool>> CreatePredicate<T>(string member, object value, TypeSearch type)
    {
        var p = System.Linq.Expressions.Expression.Parameter(typeof(T));
        System.Linq.Expressions.Expression body = p;
        foreach (var subMember in member.Split('.'))
        {
            body = System.Linq.Expressions.Expression.PropertyOrField(body, subMember);
        }

        var res = System.Linq.Expressions.Expression.Lambda<Func<T, bool>>(
                System.Linq.Expressions.Expression.Call(
                    System.Linq.Expressions.Expression.Call(
                        body,
                        "ToUpper", null),
                    type.ToString(), null,
                    System.Linq.Expressions.Expression.Constant(value.ToString().ToUpper())
                ), p);

        return res;
    }
4

1 に答える 1

10

エラー メッセージで説明されているように、タイプ - andに複数のEqualsメソッドが定義されています。必要なメソッドを見つけるために名前のみを使用しているため、一致はあいまいです。stringEquals(object)Equals(string)

MethodInfo1 つの解決策は、 for メソッドをExpression.Callegに渡すことです。

MethodInfo equalsMethod = typeof(string).GetMethod("Equals", new[] { typeof(string) });
Expression.Call(instanceExpr, equalsMethod, Expression.Constant(value.ToString().ToUpper()));
于 2013-03-30T20:27:46.023 に答える