Convert String to Type in C#
本问题已经有最佳答案,请猛点这里访问。
如果我收到一个包含类名称的字符串,并且我想将该字符串转换为实数类型(字符串中的类型),我该如何做?
我试过
1 | Type.GetType("System.Int32") |
例如,它似乎可以工作。
但是当我尝试使用自己的对象时,它总是返回空值…
我不知道字符串中提前会出现什么,所以它是我将其转换为实际类型的唯一来源。
1 | Type.GetType("NameSpace.MyClasse"); |
有什么想法吗?
你可以只使用只是名义的类型(与它的命名空间,当然)如果类型是在
1 | Type type = Type.GetType("Namespace.MyClass, MyAssembly"); |
如果会议也strongly取名为,你已经得到了包括所有的信息太。看到
alternatively,如果你有一个参考会议已经(例如通过好的认识型),你可以使用
1 2 |
尝试: P / < >
1 2 3 | Type type = Type.GetType(inputString); //target type object o = Activator.CreateInstance(type); // an instance of target type YourType your = (YourType)o; |
乔恩,飞碟是正确的usually号:) P / < >
更新:你可以specify(含在各种类型的目标的方式,mentioned乔恩,或: P / < >
1 | YourType your = (YourType)Activator.CreateInstance("AssemblyName","NameSpace.MyClass"); |
如果你真的想得到的类型的名字,你可以使用"by以下: P / < >
1 | System.AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).First(x => x.Name =="theassembly"); |
注意,你可以improve同步的性能,这drastically更多信息你有关于类型*你想贷款业务。 P / < >
使用以下方法loadtype到使用系统。reflection负载到所有注册(GAC)和referenced assemblies和止为typename P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | 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(); } |