Как я могу преобразовать выражение параметра в функцию? - PullRequest
0 голосов
/ 16 сентября 2018

Если у меня есть динамически созданный ParameterExpression:

class Product
{
    public string Name { get; set; }
}

var propertyName = "Name";

var propertyType = typeof(Product).GetProperty(propertyName).PropertyType;
var parameterExpression = Expression.Parameter(propertyType , propertyName);

Как я могу преобразовать его в Func<Product, TPropertyType>?

Я специально хочу передать это в Where или OrderBy методы linq, используемые структурой сущностей.

Я также открыт для других предложений, не использующих Expressions, но я очень сомневаюсь, что это возможно.

Редактировать 1 : удален вариант использования where, так как Where и OrderBy будут иметь различные реализации Удалено в попытке сузить сферу вопроса.

1 Ответ

0 голосов
/ 16 сентября 2018

Вот пример с генерацией выражений для OrderBy и Where. Как сказал в комментариях Джонатон Саллингер, вы должны знать тип имущества, которое вы заказывали во время компиляции, потому что оно указано в подписи OrderBY. Однако вы не должны знать это для Where:

class Product
{
    public string Name { get; set; }
}

static void Main(string[] args)
{
    var products = new List<Product> {
        new Product { Name = "ZZZ"},
        new Product { Name = "AAA"}
    };

    var propertyName = "Name";

    var ordered = products.AsQueryable().OrderBy(GetOrderExpression<string>(propertyName));
    Console.WriteLine(ordered.ElementAt(0).Name);
    Console.WriteLine(ordered.ElementAt(1).Name);

    var filtered = products.AsQueryable().Where(GetWhereExpression(propertyName, "AAA"));
    Console.WriteLine(filtered.Count());
    Console.WriteLine(filtered.ElementAt(0).Name);

    Console.ReadKey();
}

static Expression<Func<Product, TKey>> GetOrderExpression<TKey>(string propertyName)
{
    var prm = Expression.Parameter(typeof(Product), "p");
    var prop = Expression.Property(prm, typeof(Product), propertyName);
    var lambda = Expression.Lambda<Func<Product, TKey>>(prop, "p", new[] { prm });

    return lambda;
}

static Expression<Func<Product, bool>> GetWhereExpression(string propertyName, object value)
{
    var prm = Expression.Parameter(typeof(Product), "p");
    var prop = Expression.Property(prm, typeof(Product), propertyName);
    var equal = Expression.Equal(prop, Expression.Constant(value));
    var lambda = Expression.Lambda<Func<Product, bool>>(equal, "p", new[] { prm });

    return lambda;
}

Надеюсь, это поможет.

...