AspNetCore десериализация анонимного объекта в модульном тестировании [дубликат]

Невозможность связывания с соответствующими библиотеками / объектными файлами или компиляция файлов реализации

Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.

В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.

g++ -o test objectFile1.o objectFile2.o -lLibraryName

Здесь libraryName - это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so, но вы должны писать только -lfoo. В Windows этот же файл можно назвать foo.lib, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›. Обязательно не записывайте пробел после -l или -L.

Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в

В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib (в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies. (путь к файлу lib должен быть добавлен в Linker -> General -> Additional Library Directories). При использовании сторонней библиотеки, которая предоставляется с файлом lib, отказ в этом обычно приводит к ошибке.

Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).

В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».

38
задан gdoron 17 September 2013 в 15:25
поделиться

5 ответов

Анонимные объекты internal, что означает, что их члены очень ограничены за пределами сборки, которая объявляет их. dynamic уважает доступность, поэтому делает вид, что не может видеть этих членов. Если сайт вызова находился в одной и той же сборке, я ожидаю, что он сработает.

Ваш код отражения соответствует доступности member , но обходит доступность этого типа - следовательно, он работает.

Короче: номер

35
ответ дан Marc Gravell 28 August 2018 в 08:19
поделиться

Вы можете использовать NewtonSoft или библиотеки MVC Asp.net:

var data = Json.Decode(Json.Encode(_controller.Foo().Data));

var data=JsonConvert.DeserializeObject<Dictionary<string,object>>(JsonConvert.SerializeObject((_controller.Foo().Data))

1
ответ дан Chris F Carroll 28 August 2018 в 08:19
поделиться

Анонимный тип - это обычный статический тип в .NET, просто вы не даете ему имени (однако, компилятор). Вот почему кастинг dynamic не будет работать. Однако, если у вас есть контроль над Foo(), вы можете построить и вернуть объект dynamic вместо анонимного, а затем ваш код будет работать. Это должно сделать трюк:

dynamic JsonResult Foo() {
    dynamic data = new ExpandoObject();
    data.details = "something";
    data.mode = "More";
    return Json(data);
}
7
ответ дан dasblinkenlight 28 August 2018 в 08:19
поделиться

В этом блоге был рабочий ответ: http://blog.jorgef.net/2011/06/converting-any-object-to-dynamic.html - Спасибо @ Хорхе-Фиоранелли.

public static class DynamicExtensions {
    public static dynamic ToDynamic(this object value) {
        IDictionary<string, object> expando = new ExpandoObject();

        foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
            expando.Add(property.Name, property.GetValue(value));

        return expando as ExpandoObject;
    }
}
24
ответ дан Hafthor 28 August 2018 в 08:19
поделиться

Как было предложено @TrueWill и @Marc Gravell, которые также упомянули это сообщение в блоге

. Так как это для модульного тестирования, вы можете использовать InternalsVisibleTo. См. Анонимные типы являются внутренними, C # 4.0 Динамический Осторожно! Благодаря @MarcGravell для указания, что анонимные объекты являются внутренними!

Нижняя строка: настройте отображение [assembly: InternalsVisibleTo("foo")], если вы хотите поделиться анонимным объектом с одной сборки на другую. В случае OP это будет вопрос об установке этого в проекте MVC-контроллера, ссылаясь на тестовый проект . В моем конкретном случае, наоборот (поскольку я передаю анонимный объект из моего тестового проекта в проект «производственный код»).

Самый простой способ в этом «другом проекте» для его использования, безусловно, нужно направить его на dynamic, а затем просто использовать свойства, как обычно. Это действительно работает, никаких проблем.

Итак, нижняя строка: я чувствую, что ответ Марка Гравелла немного неверен; это может быть сделано ясно ( iff ваши проекты могут быть модифицируемы вами, поэтому вы можете соответствующим образом настроить отображение InternalsVisibleTo, и это не создает проблемы по какой-либо другой причине).

4
ответ дан Per Lundberg 28 August 2018 в 08:19
поделиться
Другие вопросы по тегам:

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