0
static class QueryableExtensions
{
private static MethodInfo StringContainsMethod;
private static MethodInfo StringStartsWithMethod;
static QueryableExtensions()
{
    Type[] singleStringParam = new[] { typeof(string) };
    StringContainsMethod = typeof(string).GetMethod("Contains", singleStringParam);
    StringStartsWithMethod = typeof(string).GetMethod("StartsWith", singleStringParam);
}
public static IQueryable<T> AppendTextFilter<T>(this IQueryable<T> queryable, Expression<Func<T, string>> memberSelector, string condition, string value)
{
    Expression expression = null;
    switch (condition)
    {
        case "StartsWith":
            expression = Expression.Call(memberSelector.Body, StringStartsWithMethod, Expression.Constant(value));
            break;
        case "Equals":
            expression = Expression.Equal(memberSelector.Body, Expression.Constant(value));
            break;
        case "Contains":
            expression = Expression.Call(memberSelector.Body, StringContainsMethod, Expression.Constant(value));
            break;
        default:
            throw new NotSupportedException(string.Format("'{0}' is not a supported condition", condition));
    }
    var lambda = Expression.Lambda<Func<T, bool>>(expression, memberSelector.Parameters);
    return queryable.Where(lambda);
}
}

私がグーグルで検索すると、私はクラスを超えています.まあ、それは本当に私を大いに助けます.しかし、それでも私のニーズを満たすことはできません.
問題は、「文字列」タイプのフィールドしか処理できないことです。上記のブロック コードでわかるように、このメソッドは T,string でのみ処理できます。
単一のメソッド内で必要なタイプを処理するにはどうすればよいですか?

4

1 に答える 1

0

まあ、アイデアは、このように文字列をジェネリック型に置き換えることです。

public static IQueryable<T> AppendTextFilter<T, TValue>(
      this IQueryable<T> queryable, 
      Expression<Func<T, TValue>> memberSelector, 
      string condition, 
      TValue value)

しかし、あなたのサンプルでは、​​これはあまり意味がありません。たとえば、 type が ...StartsWithの場合に を適用できるからです。TValuestring

于 2012-07-20T07:59:54.897 に答える