2012-06-13 3 views
3

Итак, вот моя проблема:Как получить тип универсального интерфейса по имени типа?

У меня есть xml-файл с записью метода и его параметров. Этот XML-файл, записанный список значений ID с .net родового именем типа интерфейса следующим:

System.Collections.Generic.IList`1[CoreLib.Domain.MyClass] 

Я знаю, что большинство из этих параметров будет Перечень Generic или словарь. когда я пытаюсь использовать GetType на значение строки Читаю с XML, все это возвращает нулевое значение, и если я пытаюсь установить флаг бросить исключение истинно, он выдает следующее сообщение:

«МОГ не загружать тип 'CoreLib.Domain.MyClass' из сборка 'TestLibrary, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'. "

Что является лучшей стратегией получения чего-то, что я могу оттолкнуть от фактического типа, который я мог бы заполнить? Заранее спасибо!

UPDATE Я попытался добавить ссылки на сборки с именем строки, как в следующем:

Type.GetType("System.Collections.Generic.List`1[CoreLib.Domain.MyClass,CoreLibrary]") 

или

coreLibAssembly.GetType("System.Collections.Generic.List`1[CoreLib.Domain.MyClass,CoreLibrary]") 

Оба результата в нулевой объект, или если я заказываю исключение быть выброшенным, то же сообщение, которое я получил, если я не указал имя сборки. Я также попытался использовать средство просмотра привязки к сборке, но приложение не появляется в списке, и ничто не появляется в приложении после запуска моего кода (он находится в тестовом проекте, выполняемом nunit).

Любые мысли?

+0

Я также попытался включить полное имя сборки в определение T общего родословного, но все равно не повезло. –

ответ

0

Я понял. проблема заключается в том, как ссылаются сборки, и как метод GetType определяет, где идет сборка. Я в конечном итоге решить эту проблему с Assembly Resolver анонимными делегатами GetType:

result = Type.GetType(typeName + ",mscorlib", //<-- needing to identify the mscorlib for generics! 
     //this anonymous delegate method is used by the GetType Framework to identify and return the correct assembly for the given assembly name. 
     //most of this is default, except to handle the mscorlib library 
     delegate(AssemblyName potentialAssembly) 
     { 
      if (potentialAssembly.Name == coreLibAssembly.FullName) 
       return coreLibAssembly; // this was never called, I had to check the namespace within the rest of my code 
      else if (potentialAssembly != null) 
       return Assembly.Load(potentialAssembly); 
      else 
       return null; 
     }, 
     //this anonymous delegate is used to return the type specific to the assembly. this method is called for each nested generic, 
     //so we don't have to parse the type string name by hand. 
     delegate(Assembly potentialAssembly, string inputTypeName, bool ignoreCase) 
     { 
      if (inputTypeName.StartsWith("CoreLib.Domain")) 
       return coreLibAssembly.GetType(inputTypeName, true, ignoreCase); 
      else if (potentialAssembly != null) 
       return potentialAssembly.GetType(inputTypeName, true, ignoreCase); 
      else 
       return Type.GetType(inputTypeName, true, ignoreCase); 
     }, true); 

сейчас, если общий Type.GetType (строка TYPENAME) не работает, я использую этот код для разбора через строку типа, и сопоставлять сборки с соответствующими именами типов в заданной строковой переменной typeName.

1

Вы можете передать строку, как у вас, в Type.GetType(). Например:

Type t = Type.GetType("System.Collections.Generic.Dictionary`2[System.String,System.Int32]"); 

Я подозреваю, в вашем случае, CLR не знает, как решить тип CoreLib.Domain.MyClass. Вам может понадобиться, чтобы помочь ему вместе, указав узел, как в этом примере taken from MSDN:

Type.GetType("System.Collections.Generic.Dictionary`2[System.String,[MyType,MyAssembly]]") 

Если после указания сборки он по-прежнему «взрывать» (в следующий раз, предлагаю вам определить, что лучше, например, с конкретным ошибка, исключение или трассировка стека :-) попробуйте запустить Fusion Log Viewerкак администратор (иначе он бесшумно выходит из строя) для сбоев привязки журнала.

+0

Я попытался оба из них, и я продолжаю сталкиваться с проблемами сборки: один, пространство имен коллекций находится в mscorlib, поэтому я не могу использовать Assembly.GetType ... , и если я попытаюсь использовать Type.GetType с помощью указанными именами сборки, он игнорирует данное имя сборки и все еще ищет объект в моей тестовой библиотеке. (извините за все комментарии, мне действительно нужно заставить это работать!) –

+0

Это на самом деле не сработало. Случилось так, что Type.GetType каким-то образом, хотя имя сборки в родовом было другим классом и пыталось идентифицировать его как тип. –

+0

Думаю, вам может понадобиться дополнительный набор []. Вы не делаете то, что показывает MSDN. Попробуйте ... List'1 [[CoreLib.Domain.MyClass, CoreLibrary]] –

Смежные вопросы