Зависит от того, какой сборкой является класс. Если он находится в 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», то вам нужно каким-то образом получить имя пространства имен (или как имя пространства имен, так и имя сборки, если это ссылочная сборка) и согласовать его с именем класса. Что-то вроде:
//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
и т. Д.