Почему я должен указать пространство имен в параметре для Assembly.GetType ()? - PullRequest
0 голосов
/ 14 сентября 2018

Возьмите следующий пример:

var assembly = Assembly.Load("ProjA.Primates");
var myType = assembly.GetType("ProjA.Primates.Bonobo");

Если я не укажу «ProjA.Primates». подстрока, исключение выдается.

Почему он не может успешно найти тип Bonobo в загруженной сборке?

1 Ответ

0 голосов
/ 14 сентября 2018

Имя пространства имен является частью полного имени типа. Например, полное имя List<T> равно System.Collections.Generic.List<T>

Использование полных имен везде было бы неудобно, поэтому C # позволяет пропускать пространство имен части, добавляя директиву using в верхней части исходного кода. Однако это только хитрость компилятора, которая добавляет пространство имен в список мест для поиска разрешения типа.

Вы можете использовать LINQ для поиска класса по его имени (в отличие от его полного имени) следующим образом:

var myType = assembly.GetTypes().SingleOrDefault(t => t.Name == "Bonobo");

Примечание: Ваш подход более строг в том смысле, что изменение пространства имен приведет к ошибке. Приведенный выше подход, с другой стороны, менее предсказуем, поскольку вы можете или не хотите выбирать класс из другого пространства имен. Кроме того, произойдет сбой, если в одной сборке будет несколько классов с одинаковым коротким именем и разными пространствами имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...