C# Linq 表达式使用变量的字符串值设置 lambda 表达式中的列名

C# Linq expressions using the string value of a variable to set the column name in a lambda expression

我有以下元组:

Tuple<Expression<Func<Client, object>>, SortOrder>(x => x.ClientLastName, SortOrder.Descending)

在这种情况下,我知道实体 - "Client" 并且您正在使用 "ClientLastName" 列.. x => x.ClientLastName.

我想将其更改为实体为 T 的通用版本,我使用值 keyValue.Key 提供列名...例如,在本例中为 keyValue.Key = "ClientLastName" .

我试过这个:

        foreach (KeyValuePair<string, SortDirection> keyValue in sortItems) {
            tupleList.Add(new Tuple<Expression<Func<T, object>>, SortDirection>(x => keyValue.Key, keyValue.Value));
        };

即使 T 是客户端并且 keyValue.Key 是列名 "ClientLastName"

它不起作用..它只是想出了:

它没有替换 keyValue.Key 的值,而是使用实际值..

看到,他用了

d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d))

我改成了:

Tuple<Expression<Func<T, object>>, SortDirection>(x => (string)typeof(T).GetProperty(keyValue.Key).GetValue(x), keyValue.Value));

哪个没用。

我该怎么做 x => x.keyValue.Key 它将 keyValue.Key 替换为其字符串值,我可以获得 x => x.ClientLastName 的等价物?

动态构建所需的表达式并将其传递给元组

Tuple<Expression<Func<T, object>>, SortDirection> BuildTuple<T>(KeyValuePair<string, SortDirection> keyValue) {
    var type = typeof(T);
    var propertyInfo = type.GetProperty(keyValue.Key);
    var direction = keyValue.Value;

    // T x
    var parameter = Expression.Parameter(type, "x");
    // x.Property
    var property = Expression.Property(parameter, propertyInfo);
    // T x => x.Property
    var expression = Expression.Lambda<Func<T, object>>(property, parameter);

    return new Tuple<Expression<Func<T, object>>, SortDirection>(expression, direction);
}

循环的通用版本变为

foreach (KeyValuePair<string, SortDirection> keyValue in sortItems) {
    var tuple = BuildTuple<T>(keyValue);
    tupleList.Add(tuple);
};

假设它在泛型方法中。