Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.
В разделе 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 помещает информацию в поле внизу каждой функции в разделе «Библиотека».
Анонимные объекты internal
, что означает, что их члены очень ограничены за пределами сборки, которая объявляет их. dynamic
уважает доступность, поэтому делает вид, что не может видеть этих членов. Если сайт вызова находился в одной и той же сборке, я ожидаю, что он сработает.
Ваш код отражения соответствует доступности member , но обходит доступность этого типа - следовательно, он работает.
Короче: номер
Вы можете использовать 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))
Анонимный тип - это обычный статический тип в .NET, просто вы не даете ему имени (однако, компилятор). Вот почему кастинг dynamic
не будет работать. Однако, если у вас есть контроль над Foo()
, вы можете построить и вернуть объект dynamic
вместо анонимного, а затем ваш код будет работать. Это должно сделать трюк:
dynamic JsonResult Foo() {
dynamic data = new ExpandoObject();
data.details = "something";
data.mode = "More";
return Json(data);
}
В этом блоге был рабочий ответ: 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;
}
}
Как было предложено @TrueWill и @Marc Gravell, которые также упомянули это сообщение в блоге
. Так как это для модульного тестирования, вы можете использовать InternalsVisibleTo. См. Анонимные типы являются внутренними, C # 4.0 Динамический Осторожно! Благодаря @MarcGravell для указания, что анонимные объекты являются внутренними!
Нижняя строка: настройте отображение [assembly: InternalsVisibleTo("foo")]
, если вы хотите поделиться анонимным объектом с одной сборки на другую. В случае OP это будет вопрос об установке этого в проекте MVC-контроллера, ссылаясь на тестовый проект . В моем конкретном случае, наоборот (поскольку я передаю анонимный объект из моего тестового проекта в проект «производственный код»).
Самый простой способ в этом «другом проекте» для его использования, безусловно, нужно направить его на dynamic
, а затем просто использовать свойства, как обычно. Это действительно работает, никаких проблем.
Итак, нижняя строка: я чувствую, что ответ Марка Гравелла немного неверен; это может быть сделано ясно ( iff ваши проекты могут быть модифицируемы вами, поэтому вы можете соответствующим образом настроить отображение InternalsVisibleTo, и это не создает проблемы по какой-либо другой причине).