Ответ 1
Это зависит от того, какая сборка является классом. Если в mscorlib
или вызывать сборку все, что вам нужно,
Type type = Type.GetType("namespace.class");
Но если он ссылается на другую сборку, вам нужно будет сделать:
Assembly assembly = typeof(SomeKnownTypeInAssembly).Assembly;
Type type = assembly.GetType("namespace.class");
//or
Type type = Type.GetType("namespace.class, assembly");
Если у вас есть только имя класса "MyClass", вам нужно каким-то образом получить имя пространства имен (или имя пространства имен и имя сборки в случае, если это ссылка), и concat, что вместе с именем класса. Что-то вроде:
//if class is in same assembly
var namespace = typeof(SomeKnownTypeInNamespace).Namespace;
Type type = Type.GetType(namespace + "." + "MyClass");
//or for cases of referenced classes
var assembly = typeof(SomeKnownTypeInAssembly).Assembly;
var namespace = typeof(SomeKnownTypeInNamespace).Namespace;
Type type = assembly.GetType(namespace + "." + "MyClass");
//or
Type type = Type.GetType(namespace + "." + "MyClass" + ", " + assembly.GetName().Name);
Если у вас нет абсолютно ничего (без предварительного уведомления о имени сборки или имени пространства имен), а просто в имени класса, вы можете запросить все сборки, чтобы выбрать подходящую строку. Но это должно быть намного медленнее:
Type type = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.FirstOrDefault(x => x.Name == "MyClass");
Обратите внимание, что это возвращает первый класс соответствия, поэтому не обязательно быть очень точным, если у вас будет несколько классов с одинаковым именем в сборках/пространствах имен. В любом случае кеширование значений имеет смысл здесь. Слегка более быстрый способ - предположить, что существует одно пространство имен по умолчанию:
Type type = AppDomain.CurrentDomain.GetAssemblies()
.Select(a => new { a, a.GetTypes().First().Namespace })
.Select(x => x.a.GetType(x.Namespace + "." + "MyClass"))
.FirstOrDefault(x => x != null);
Но это опять-таки предположение, что ваш тип будет иметь такое же пространство имен, что и некоторый другой случайный класс в сборке; слишком хрупкий, не очень хороший.
Если вам нужны классы других доменов, вы можете получить список всех доменов приложений, следуя этой ссылке. Затем вы можете сделать тот же запрос, что и выше, для каждого домен. Если ваша сборка, в которой находится тип, еще не загружена, вам необходимо вручную загрузить ее с помощью Assembly.Load
, Assembly.LoadFrom
и т.д.