将string转换为C#中的types
如果我收到一个包含类(对象)名称的string,并且想将此string转换为实际types(string中的那个),那我该怎么做?
我试过了
Type.GetType("System.Int32")
例如,它似乎工作。
但是,当我用我自己的对象尝试,它总是返回null …
我不知道string中会有什么,所以这是我将它转换为真正的types的唯一来源。
Type.GetType("NameSpace.MyClasse");
任何想法?
如果types在mscorlib
或调用程序集中,则只能使用types的名称(当然是使用它的名称空间)。 否则,您还必须包含程序集名称:
Type type = Type.GetType("Namespace.MyClass, MyAssembly");
如果程序集是强命名的,那么您也必须包含所有这些信息。 有关更多信息,请参阅Type.GetType(string)
的文档。
另外,如果你已经有了一个对程序集的引用(例如通过一个众所周知的types),你可以使用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;
乔恩Skeet是正常的:)
更新:你可以用Jon提到的各种方式指定包含目标types的程序集,或者:
YourType your = (YourType)Activator.CreateInstance("AssemblyName", "NameSpace.MyClass");
如果你真的想要通过名字得到types,你可以使用以下内容:
System.AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).First(x => x.Name == "theassembly");
请注意,您可以大幅提高关于您要加载的types的更多信息的性能。
使用以下LoadType方法来使用System.Reflection加载所有注册( GAC )和引用的程序集并检查typeName
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<string> assemblyFullnames = new List<string>(); List<Type> types = new List<Type>(); 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<string> files = new List<string>(); 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(); }