Препроцессор ## Оператор и переменная

Альтернативный ответ, который не требует Automapper для преобразования DTO в Entity, использует DbEntry:

        var oldEntity = DbSet.FirstOrDefault(x => x.Id == updatedEntity.Id);
        var oldEntry = Context.Entry(oldEntity);

        oldEntry.CurrentValues.SetValues(updatedEntity);

Вам не нужно проверять наличие / состояние, потому что вы получаете старую сущность сначала, так что к нему привязано отслеживание изменений. Кроме того, CurrentValues.SetValues ​​могут принимать разные типы, в этом примере updatedEntity является DTO. Документация по значениям значений объясняется следующим образом:

Устанавливает значения этого словаря, считывая значения из заданного объекта. Данный объект может быть любого типа. Любое свойство объекта с именем, которое соответствует имени свойства в словаре и может быть прочитано, будет считано. Другие свойства будут проигнорированы. Это позволяет, например, копировать свойства из простых объектов передачи данных (DTO).

Похоже, что он уже может работать в режиме autapper-esque.

0
задан Sneftel 11 March 2019 в 14:02
поделиться

3 ответа

Вы должны использовать фактический 0 (или другой макрос). Расширение макроса обрабатывается препроцессором C во время компиляции. Он ничего не знает о значениях переменных во время выполнения.

0
ответ дан rveerd 11 March 2019 в 14:02
поделиться

Как уже говорилось, расширение макроса выполняется во время компиляции, поэтому имя функции не будет известно во время выполнения.

Более целесообразно использовать указатели на функции и массив для них.

Пример:

typedef int (*TFoo)(int);

int foo1(int x)
{
    printf("from foo1: x = %d\n", x);
    return 0;
}

int foo2(int x)
{
    printf("from foo2: x = %d\n", x);
    return 0;
}

TFoo foos[2] = {foo1, foo2};
#define foo(i, x) foos[i](x)

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

0
ответ дан Jabberwocky 11 March 2019 в 14:02
поделиться

Предварительная обработка 'c' - это процесс замены макросов текстом из их определений. некоторые операции, такие как ##, позволяют добавлять свой аргумент в виде текста в определения. Итак, все сделано еще до начала компиляции.

В результате в вашем случае FUN(fun,i) будет подставлено в виде текста и формы funi. Единственный ограниченный способ создания имен функций, которые вы хотите, - это использовать реальные текстовые значения или другие макросы. Вот 2 примера, которые будут работать с предварительной обработкой:

FUN(fun, 0)(1);

или

#define I 0
FUN(fun, I)(1);

В последнем случае I является самим макросом, поэтому он также работает. (всегда полезно называть имя макроса заглавными буквами).

0
ответ дан Serge 11 March 2019 в 14:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: