Как получить соответствующий MonoDevelop.Projects.Dom.IType из System.Type? - PullRequest
0 голосов
/ 24 декабря 2010

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

Я делаю следующее:

System.Type type = ...; //known System.Type instance;
var dom = ProjectDomService.GetAssemblyDom(project.TargetRuntime, type.Assembly.FullName);

После этого (как я и ожидал) dom.Types должно содержатьвся экспортированная сборка напечатана, но она пуста;

Есть ли способ получить IType от Type?

UPD: (решено)

Здесь код, помогающий получить правильныйЭкземпляр AssemblyDom, а затем Get IType по имени:

string assemblyName = targetRuntime.AssemblyContext
                        .GetAssemblyNameForVersion(type.Assembly.FullName, targetFramework);

var assemblyLocation = targetRuntime.AssemblyContext
            .GetAssemblyLocation(assemblyName, targetFramework);

var assemblyDom = ProjectDomService.GetAssemblyDom(targetRuntime, assemblyLocation);

var t = assemblyDom.GetType(type.FullName);

1 Ответ

1 голос
/ 24 декабря 2010

Несмотря на имя параметра, я думаю Второй параметр GetAssemblyDom - это путь к файлу сборки, а не имя сборки.(Даже если он может разрешать имена сборок, это будет верно только для системных сборок или пакетов в целевой среде выполнения.)

Причина, по которой нет простого поиска из System.Type в IType, заключается в том, что онпочти никогда не нужен.Цель IType - избежать загрузки сборок и реальных типов, поскольку они не могут быть выгружены и невозможно загрузить типы из разных структур или сборок.Поэтому код, который имеет дело с общими типами IType, никогда не должен иметь дело с общими типами.

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

...