Это зависит от того, в какой сборке находится класс. Если он находится в 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
и т. Д.
person
nawfal
schedule
05.12.2013