Преобразовать строку в тип C #

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

Я пытался

Type.GetType("System.Int32") 

например, он работает.

Но когда я пытаюсь использовать свой собственный объект, он всегда возвращает null …

Я не знаю, что будет в строке заранее, так что это единственный источник для преобразования его в реальный тип.

 Type.GetType("NameSpace.MyClasse"); 

Есть идеи?

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

 Type type = Type.GetType("Namespace.MyClass, MyAssembly"); 

Если assembly сильно названа, вы должны также включить всю эту информацию. Дополнительную информацию см. В документации для Type.GetType(string) .

В качестве альтернативы, если у вас уже есть ссылка на сборку (например, с помощью известного типа), вы можете использовать Assembly.GetType :

 Assembly asm = typeof(SomeKnownType).Assembly; Type type = asm.GetType(namespaceQualifiedTypeName); 

Пытаться:

 Type type = Type.GetType(inputString); //target type object o = Activator.CreateInstance(type); // an instance of target type YourType your = (YourType)o; 

Джон Скит прав, как обычно 🙂

Обновление. Вы можете указать сборку, содержащую целевой тип, различными способами, как упоминал Джон, или:

 YourType your = (YourType)Activator.CreateInstance("AssemblyName", "NameSpace.MyClass"); 

Если вы действительно хотите получить тип по имени, вы можете использовать следующее:

 System.AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).First(x => x.Name == "theassembly"); 

Обратите внимание, что вы можете значительно повысить производительность, чем больше информации о типе, который вы пытаетесь загрузить.

используйте следующий метод LoadType для использования System.Reflection для загрузки всех зарегистрированных ( GAC ) и ссылочных ассемблеров и проверки типаName

 public Type[] LoadType(string typeName) { return LoadType(typeName, true); } public Type[] LoadType(string typeName, bool referenced) { return LoadType(typeName, referenced, true); } private Type[] LoadType(string typeName, bool referenced, bool gac) { //check for problematic work if (string.IsNullOrEmpty(typeName) || !referenced && !gac) return new Type[] { }; Assembly currentAssembly = Assembly.GetExecutingAssembly(); List assemblyFullnames = new List(); List types = new List(); if (referenced) { //Check refrenced assemblies foreach (AssemblyName assemblyName in currentAssembly.GetReferencedAssemblies()) { //Load method resolve refrenced loaded assembly Assembly assembly = Assembly.Load(assemblyName.FullName); //Check if type is exists in assembly var type = assembly.GetType(typeName, false, true); if (type != null && !assemblyFullnames.Contains(assembly.FullName)) { types.Add(type); assemblyFullnames.Add(assembly.FullName); } } } if (gac) { //GAC files string gacPath = Environment.GetFolderPath(System.Environment.SpecialFolder.Windows) + "\\assembly"; var files = GetGlobalAssemblyCacheFiles(gacPath); foreach (string file in files) { try { //reflection only Assembly assembly = Assembly.ReflectionOnlyLoadFrom(file); //Check if type is exists in assembly var type = assembly.GetType(typeName, false, true); if (type != null && !assemblyFullnames.Contains(assembly.FullName)) { types.Add(type); assemblyFullnames.Add(assembly.FullName); } } catch { //your custom handling } } } return types.ToArray(); } public static string[] GetGlobalAssemblyCacheFiles(string path) { List files = new List(); DirectoryInfo di = new DirectoryInfo(path); foreach (FileInfo fi in di.GetFiles("*.dll")) { files.Add(fi.FullName); } foreach (DirectoryInfo diChild in di.GetDirectories()) { var files2 = GetGlobalAssemblyCacheFiles(diChild.FullName); files.AddRange(files2); } return files.ToArray(); } 
  • Типы Haskell расстраивают простую «среднюю» функцию
  • Что такое типы POD в C ++?
  • Scala: Что такое TypeTag и как его использовать?
  • Как написать функцию для общих чисел?
  • Где в памяти мои переменные, хранящиеся в C?
  • Как определить тип MIME загруженного файла в ASP.NET?
  • Являются ли HLists не более чем сложным способом написания кортежей?
  • Generics в C #, используя тип переменной как параметр
  • Определить тип файла изображения
  • .NET Integer vs Int16?
  • Поиск типа объекта в C ++
  • Давайте будем гением компьютера.