Преобразовать строку в тип 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(); } 
  • Типы и classы переменных
  • Преобразование streamа int в char в java
  • Полезно ли использовать целочисленный столбец для хранения почтовых индексов США в базе данных?
  • C # - как определить, является ли тип числом
  • Поиск типа объекта в C ++
  • .NET. Определите тип этого «classа» в статическом методе
  • Использование `inline` в F #
  • Разница между `data` и` newtype` в Haskell
  • Когда следует использовать std :: size_t?
  • Как определить разные типы для одного и того же classа в C ++
  • Условный оператор не может действовать неявно?
  • Interesting Posts

    Максимизированный хром показывает небольшую линию на втором экране

    получение исключения: не определен bean с именем «springSecurityFilterChain»

    Как восстановить данные с внешнего жесткого диска?

    Почему вы не можете уменьшить видимость метода в подclassе Java?

    Увеличить расстояние между текстом и заголовком по оси y

    В C # следует ли использовать string.Empty или String.Empty или “” для инициализации строки?

    Развертывание приложения RoR для Heroku с помощью SQLite 3 не выполняется

    Как редактировать файл хостов в Windows 7

    Почему диспетчер загрузки bitsadmin.exe не работает для меня?

    Какова латентность и пропускная способность инструкции RDRAND на Ivy Bridge?

    Выйти и перезапустить чистый сеанс R из R?

    Заголовок песни iTunes Прокрутка в cocoa

    Удалить / Сбросить все записи в Core Data?

    Найти повторяющиеся фразы – любой инструмент или регулярное выражение

    predict.lm () с неизвестным уровнем фактора в тестовых данных

    Давайте будем гением компьютера.