根据typeName获取Type较为完备的办法open in new window

前年还在开发.NET产品,我那时候编写一个C#脚本解释引擎,遇到一个问题是,Type.GetType()方法无法获取尚未装载类型。这些天,在阅读一些相关的代码时,得知了一种较为完整的方法,共享如下:

internal static Type FindTypeInCurrentDomain(string typeName)
{
    Type type = null;

    //如果该类型已经装载
    type = Type.GetType(typeName);
    if (type != null)
    {
        return type;
    }

    //在EntryAssembly中查找
    if (Assembly.GetEntryAssembly() != null)
    {
        type = Assembly.GetEntryAssembly().GetType(typeName);
        if (type != null)
        {
            return type;
        }
    }

    //在CurrentDomain的所有Assembly中查找
    Assembly[] assemblyArray = AppDomain.CurrentDomain.GetAssemblies();
    int assemblyArrayLength = assemblyArray.Length;
    for (int i = 0; i < assemblyArrayLength; ++i)
    {
        type = assemblyArray[i].GetType(typeName);
        if (type != null)
        {
            return type;
        }
    }

    for (int i = 0; (i < assemblyArrayLength); ++i)
    {
        Type[] typeArray = assemblyArray[i].GetTypes();
        int typeArrayLength = typeArray.Length;
        for (int j = 0; j < typeArrayLength; ++j)
        {
            if (typeArray[j].Name.Equals(typeName))
            {
                return typeArray[j];
            }
        }
    }

    return type;
}


2004-07-07 23:11Ying-Shen 回复 引用

Type.GetType()方法无法获取尚未装载类型 这个是由于你的string里面没有提供Assembly name的缘故

为什么在Assembly.GetType(typeName)找不到后 还要继续Type.Name.Equals(typeName)?

你现在的方法还是没有解决获取未加载的Assembly里的类型的问题呀。

2004-07-08 01:39温少的日志 回复 引用

可以的,如果你的bin目录下有该Assembly,那就会自动加载。请注意: Assembly[] assemblyArray = AppDomain.CurrentDomain.GetAssemblies();

Contributors: FHL