C# 将字符串转换为C中的类型#

C# 将字符串转换为C中的类型#,c#,.net,string,types,C#,.net,String,Types,如果我收到一个包含类名的字符串,并且我想将该字符串转换为一个实类型(字符串中的类型),我该怎么做 我试过了 Type.GetType("System.Int32") 例如,它似乎起了作用 但当我尝试使用自己的对象时,它总是返回null 我事先不知道字符串中会有什么,所以它是我将其转换为实际类型的唯一来源 Type.GetType("NameSpace.MyClasse"); 有什么想法吗?如果类型位于mscorlib或调用程序集中,则只能使用类型的名称(当然还有名称空间)。否则,还必须包括程

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

我试过了

Type.GetType("System.Int32")
例如,它似乎起了作用

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

我事先不知道字符串中会有什么,所以它是我将其转换为实际类型的唯一来源

Type.GetType("NameSpace.MyClasse");
有什么想法吗?

如果类型位于
mscorlib
或调用程序集中,则只能使用类型的名称(当然还有名称空间)。否则,还必须包括程序集名称:

Type type = Type.GetType("Namespace.MyClass, MyAssembly");
如果程序集是强名称的,那么还必须包含所有这些信息。有关更多信息,请参阅文档

或者,如果已经有对程序集的引用(例如通过已知类型),则可以使用:

如果类型位于
mscorlib
或调用程序集中,则只能使用类型的名称(当然还有名称空间)。否则,还必须包括程序集名称:

Type type = Type.GetType("Namespace.MyClass, MyAssembly");
如果程序集是强名称的,那么还必须包含所有这些信息。有关更多信息,请参阅文档

或者,如果已经有对程序集的引用(例如通过已知类型),则可以使用:

尝试:

乔恩·斯基特一如既往地是对的:)

更新:您可以用Jon提到的各种方式指定包含目标类型的程序集,或者:

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

乔恩·斯基特一如既往地是对的:)

更新:您可以用Jon提到的各种方式指定包含目标类型的程序集,或者:

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

如果确实希望按名称获取类型,可以使用以下选项:

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

请注意,如果您有更多关于试图加载的类型的信息,则可以显著提高该类型的性能。

如果您确实希望按名称获取该类型,则可以使用以下选项:

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

请注意,如果您有更多关于尝试加载的类型的信息,则可以显著提高此方法的性能。

使用以下LoadType方法加载所有已注册()和引用的程序集,并检查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();
}
public Type[]加载类型(字符串类型名)
{
返回LoadType(typeName,true);
}
公共类型[]加载类型(字符串类型名,bool引用)
{
返回LoadType(typeName,referenced,true);
}
私有类型[]加载类型(字符串类型名、bool引用、bool gac)
{
//检查有问题的工作
if(string.IsNullOrEmpty(typeName)| |!referenced&&!gac)
返回新类型[]{};
Assembly currentAssembly=Assembly.getExecutionGassembly();
List assemblyFullnames=新列表();
列表类型=新列表();
如果(参考)
{//检查引用的程序集
foreach(currentAssembly.GetReferencedAssemblys()中的AssemblyName AssemblyName)
{
//加载方法解析引用加载的部件
Assembly=Assembly.Load(assemblyName.FullName);
//检查类型是否存在于程序集中
var type=assembly.GetType(typeName,false,true);
if(type!=null&&!assemblyFullName.Contains(assembly.FullName))
{
类型。添加(类型);
assemblyFullName.Add(assembly.FullName);
}
}
}
国际单项体育联合会(gac)
{
//GAC文件
字符串gacPath=Environment.GetFolderPath(System.Environment.SpecialFolder.Windows)+“\\assembly”;
var files=GetGlobalAssemblyCacheFiles(gacPath);
foreach(文件中的字符串文件)
{
尝试
{
//仅反射
Assembly Assembly=Assembly.ReflectionOnlyLoadFrom(文件);
//检查类型是否存在于程序集中
var type=assembly.GetType(typeName,false,true);
if(type!=null&&!assemblyFullName.Contains(assembly.FullName))
{
类型。添加(类型);
assemblyFullName.Add(assembly.FullName);
}
}
抓住
{
//您的定制处理
}
}
}
返回类型。ToArray();
}
公共静态字符串[]GetGlobalAssemblyCacheFiles(字符串路径)
{
列表文件=新列表();
DirectoryInfo di=新的DirectoryInfo(路径);
foreach(di.GetFiles(“*.dll”)中的FileInfo-fi)
{
files.Add(fi.FullName);
}
foreach(DirectoryInfo diChild在di.GetDirectories()中)
{
var files2=GetGlobalAssemblyCacheFiles(diChild.FullName);
files.AddRange(files2);
}
返回文件.ToArray();
}

使用以下LoadType方法加载所有已注册()和引用的程序集,并检查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();
}
public Type[]加载类型(字符串类型名)
{
返回LoadType(typeName,true);
}
公共类型[]加载类型(字符串类型名,bool引用)
{
返回LoadType(typeName,referenced,true);
}
私有类型[]加载类型(字符串类型名、bool引用、bool gac)
{
//检查有问题的工作
if(string.IsNullOrEmpty(typeName)| |!referenced&&!gac)
返回新类型[]{};
Assembly currentAssembly=Assembly.getExecutionGassembly();
List assemblyFullnames=新列表();
列表类型=新列表();
如果(参考)
{//检查引用的程序集
foreach(currentAssembly.GetReferencedAssemblys()中的AssemblyName AssemblyName)
{
//加载方法解析引用加载的部件
Assembly=Assembly.Load(assemblyName.FullName);
//检查类型是否存在于程序集中
var type=assembly.GetType(typeName,false,true);
if(type!=null&&!assemblyFullName.Contains(assembly.FullName))
{
类型。添加(类型);
assemblyFullName.Add(assembly.FullName);
}
}