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

  • Air_Fooj

    Air_Fooj

    24 NİSAN 2009
  • Boiler Room

    Boiler Room

    10 Mayıs 2012
  • fireflame65

    fireflame65

    27 Mart 2007