关于.net:将字符串转换为C#中的类型

Convert String to Type in C#

本问题已经有最佳答案,请猛点这里访问。

如果我收到一个包含类名称的字符串,并且我想将该字符串转换为实数类型(字符串中的类型),我该如何做?

我试过

1
Type.GetType("System.Int32")

例如,它似乎可以工作。

但是当我尝试使用自己的对象时,它总是返回空值…

我不知道字符串中提前会出现什么,所以它是我将其转换为实际类型的唯一来源。

1
Type.GetType("NameSpace.MyClasse");

有什么想法吗?


你可以只使用只是名义的类型(与它的命名空间,当然)如果类型是在mscorlib或电话会议。另有,你已经得到了包括"(名称为:好的 P / < >

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

如果会议也strongly取名为,你已经得到了包括所有的信息太。看到Type.GetType(string)为文件的更多信息。 P / < >

alternatively,如果你有一个参考会议已经(例如通过好的认识型),你可以使用Assembly.GetType: P / < >

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


尝试: 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();
}