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

  • Awesome Toys TV

    Awesome Toys

    18 HAZİRAN 2014
  • ImBluecams

    ImBluecams

    25 Kasım 2012
  • inovationgmbh

    inovationgmb

    28 EYLÜL 2010