SORU
25 EKİM 2011, Salı


Nasıl Montaj.çağırırken ReflectionTypeLoadException önlemek için()GetTypes

Türleri özel arayüzü bir kullanarak buna benzer bir kod uygulamak için bir derleme tarama için çalışıyorum:

public List<Type> FindTypesImplementing<T>(string assemblyPath)
{
    var matchingTypes = new List<Type>();
    var asm = Assembly.LoadFrom(assemblyPath);
    foreach (var t in asm.GetTypes())
    {
        if (typeof(T).IsAssignableFrom(t))
            matchingTypes.Add(t);
    }
    return matchingTypes;
}

Benim sorunum bazı durumlarda asm.GetTypes() montaj türleri mevcut olmayan bir derleme başvuru içeriyorsa, örneğin çağrılırken ReflectionTypeLoadException olsun.

Benim durumumda, bu soruna neden olan türleri ilgilenmiyorum. Aradığım türde olmayan kullanılabilir derlemeler gerekmez.

Soru: bir şekilde/özel duruma neden olan türleri göz ardı ama hala diğer türleri derleme içinde bulunan süreci atlamak mümkün mü?

CEVAP
25 EKİM 2011, Salı


Oldukça kötü bir yol olacaktır:

Type[] types;
try
{
    types = asm.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
    types = e.Types;
}
foreach (var t in types.Where(t => t != null))
{
    ...
}

Kesinlikle sinir bozucu olsa da bunu yapmak zorunda. Bir uzantı yöntemi olarak daha güzel yapmak için kullanabilirsiniz "müşteri" kod:

public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)
{
    // TODO: Argument validation
    try
    {
        return assembly.GetTypes();
    }
    catch (ReflectionTypeLoadException e)
    {
        return e.Types.Where(t => t != null);
    }
}

İyi catch bloğu return deyimi hareket için isteyebilirsiniz - çok istekli kendime, ama orada olmak büyük olasılıkla değilimkısa kod...

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bart Baker

    Bart Baker

    1 Aralık 2006
  • Canal TekZoom

    Canal TekZoo

    1 NİSAN 2012
  • Matthew Morrill

    Matthew Morr

    15 EKİM 2011