2013-11-15 3 views
0

В моем коде я пытаюсь получить тип по имени. Когда я использовал строковый аргумент, я потерпел неудачу. Затем я попытался сделать следующее в окне «Быстрые часы»:Получить тип по имени

Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).Name) 

возвращает null. Зачем? и как получить желаемый тип по имени?

+1

Что не так с помощью 'typeof (System.ServiceModel.NetNamedPipeBinding)' – clcto

+0

Вопрос в том, как это сделать по имени типа ... –

ответ

1

Type.GetType может найти типы только в mscorlib или в текущей сборке при передаче имени имени пространства имен. Чтобы заставить его работать, вам нужно «AssemblyQualifiedName».

Ассемблерное имя типа, которое нужно получить. См. AssemblyQualifiedName. Если тип находится в выполняемой в настоящее время сборке или в Mscorlib.dll, достаточно указать имя типа , соответствующее его пространству имен.

Referece Type.GetType

System.ServiceModel.NetNamedPipeBinding жизнь в "System.ServiceModel.dll" поэтому Type.GetType не может найти его.

Это будет работать

Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).AssemblyQualifiedName) 

Или, если вы знаете, сборку уже используют следующий код

assemblyOfThatType.GetType(fullName);//This just need namespace.TypeName 
+0

Вы правы. благодаря! можете ли вы дать мне какие-либо идеи о том, как получить имя AssemblyQualifiedName от имени типа? или как я могу получить instnace NetNamedPipeBinding по имени «NetNamedPipeBinding». Первоначальная идея: Activator.CreateInstance (myType); где мой тип был правильного типа –

+0

По крайней мере, знаете ли вы, какой тип сборки живет? –

+0

System.ServiceModel –

0

.Name дает вам NetNamedPipeBinding, для GetType работы вам нужно полное имя сборки (AssemblyQualifiedName)

0

Другие ответы почти все правильно. Чтобы загрузить тип по имени, вам нужно либо полное имя (если сборка уже загружена в appdomain), либо его квалификационное имя Assembly.

Полное имя - это имя типа, включая пространство имен. Вы можете получить это, позвонив по телефону Type.GetType(typeof(System.ServiceModel.NetNamedPipeBinding).FullName). В вашем надуманном примере это будет работать (поскольку сборка NetNamedPipeBinding будет загружена).

Если вы не можете быть уверены, что он загружен, используйте ответ Sriram, и пройти полный сборочный квалифицированное имя (TopNamespace.SubNameSpace.ContainingClass, MyAssembly). Это будет .NET пытаться найти и загрузить сборку htat, а затем получить тип.

1

Если вы хотите использовать простое имя (не AssemblyQualifiedName), и не беспокоиться о неоднозначной, вы можете попробовать что-то вроде этого:

public static Type ByName(string name) 
    { 
     foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies().Reverse()) 
     { 
      var tt = assembly.GetType(name); 
      if (tt != null) 
      { 
       return tt; 
      } 
     } 

     return null; 
    } 

Reverse() - для загрузки совсем недавно загружен типа (например, после компиляции кода из aspx)

+0

Wow!это решение для всех возможных случаев :). но в моем случае было достаточно сборкиOfThatType.GetType (fullName)! –

+0

Возможно, это может привести к другому классу в случае столкновения. –

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