Squeak.ru - шаблоны программирования

Как преобразовать Expression‹Func‹T, объект›› в Expression‹Func‹объект, объект››

Есть ли способ преобразовать Expression<Func<T, object>> в Expression<Func<object, object>>?


  • Превратить T в object? Нравится (object)T 13.05.2011
  • Как именно я должен это сделать? Я получаю Expression<Func<TNameSource, object>> nameSelector, и мне нужно передать это nameSelector как Expression<Func<object, object>> другой функции 13.05.2011

Ответы:


1

Я должен был сделать это раньше...

public static class ExpressionHelper {
    public static Expression<Func<object,object>> ConvertParameterToObject<T>(this Expression<Func<T,object>> source){
             return source.ReplaceParametersWithBase<T,object,object>();
    }

    public static Expression<Func<TBase,TResult>> ReplaceParameterWithBase<T,TResult,TBase>(this Expression<Func<T,TResult>> lambda)
        where T :TBase
    {
        var param = lambda.Parameters.Single();
        return (Expression<Func<TBase,TResult>>)
            ParameterRebinder.ReplaceParameters(new Dictionary<ParameterExpression, ParameterExpression>
                                                {
                                                    { param, Expression.Parameter(typeof (TBase), param.Name) }
                                                }, lambda.Body);
    }
}


public class ParameterRebinder : ExpressionVisitor
{

    private readonly Dictionary<ParameterExpression, ParameterExpression> map;



    public ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
    {

        this.map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();

    }



    public static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map, Expression exp)
    {

        return new ParameterRebinder(map).Visit(exp);

    }



    protected override Expression VisitParameter(ParameterExpression p)
    {

        ParameterExpression replacement;

        if (map.TryGetValue(p, out replacement))
        {

            p = replacement;

        }

        return base.VisitParameter(p);

    }

}
13.05.2011
  • пытаясь использовать вашу функцию, она выдает ошибку return new ParameterRebinder(map).Visit(exp); с сообщением об ошибке: свойство «System.String NewDescription» не определено для типа «System.Object». 13.05.2011
  • Эта ошибка имеет смысл. У вас нет возможности узнать, к какому типу относится объект после замены параметров, поэтому член не будет определен. В этом случае вам может понадобиться просто выполнить Compile(), произнести и вызвать, как Expression<Func<object, object>> toObj = x => stronglyTyped.Compile()((T)x) 13.05.2011
  • Я пытался ответить на эту проблему сам и закончил с тем же решением. Преобразование не будет успешным для выражений, которые используют его параметры как другой тип, чем объект. 18.11.2011

  • 2

    Как насчет такого:

    static Expression<Func<object,object>> ConvertFunction<T>(Expression<Func<T,object>> function)      
    {
        ParameterExpression p=Expression.Parameter(typeof(object));
    
        return Expression.Lambda<Func<object,object>>
        (
            Expression.Invoke(function,Expression.Convert(p,typeof(T))), p
        );
    }
    

    Тогда вы можете сказать что-то вроде этого:

    Expression<Func<string,object>> foo=s=>s.Length;
    Expression<Func<object,object>> bar=ConvertFunction(foo);
    
    var call=bar.Compile();
    Console.Write(call("hello")) ; // Prints 5
    
    13.05.2011
  • есть ли разница между этим и return x => function.Compile()((T)x)? 13.05.2011
  • этот подход изменяет выражение с {o => o.NewDescription} на {Param_0 => Invoke(o => o.NewDescription, Convert(Param_0))} есть ли способ сохранить то же выражение? 13.05.2011
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...