assembly.GetTypes () vs assembly.DefinedTypes.Select (t = t.AsType ());

1
public static IEnumerable<Type> GetAccessibleTypes(this Assembly assembly)
    {
        try
        {
#if NET40
            return assembly.GetTypes();
#else
            return assembly.DefinedTypes.Select(t => t.AsType());
#endif
        }
        catch (ReflectionTypeLoadException ex)
        {
            // The exception is thrown if some types cannot be loaded in partial trust.
            // For our purposes we just want to get the types that are loaded, which are
            // provided in the Types property of the exception.
            return ex.Types.Where(t => t != null);
        }
    }

Quali sono le differenze tra assembly.GetTypes() e assembly.DefinedTypes.Select(t => t.AsType()) ?

Codice originale: link

    
posta Oğuzhan Topçu 17.04.2014 - 01:25
fonte

1 risposta

1

Come minimo, gli oggetti restituiti sono di tipo diverso, di cui uno è un array di Type s e l'altro è un generico IQueryable<Type> .

Ecco il codice da Assembly.GetTypes ()

[ResourceExposure(ResourceScope.None)]
[ResourceConsumption(ResourceScope.Machine | ResourceScope.Assembly, ResourceScope.Machine | ResourceScope.Assembly)] 
public virtual Type[] GetTypes() 
{
    Module[] m = GetModules(false); 

    int iNumModules = m.Length;
    int iFinalLength = 0;
    Type[][] ModuleTypes = new Type[iNumModules][]; 

    for (int i = 0; i < iNumModules; i++) 
    { 
        ModuleTypes[i] = m[i].GetTypes();
        iFinalLength += ModuleTypes[i].Length; 
    }

    int iCurrent = 0;
    Type[] ret = new Type[iFinalLength]; 
    for (int i = 0; i < iNumModules; i++)
    { 
        int iLength = ModuleTypes[i].Length; 
        Array.Copy(ModuleTypes[i], 0, ret, iCurrent, iLength);
        iCurrent += iLength; 
    }

    return ret;
}
    
risposta data 17.04.2014 - 02:01
fonte

Leggi altre domande sui tag