Pergunta

Atualmente estou tentando entender alguns aspectos da programação em C#.Agora estou aprendendo LateBinding.Eu entendo como criar um programa simples como o abaixo.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Try to do something with late bindings");
        Assembly a = null;
        try
        {
            a = Assembly.Load("CarLibrary");
            Console.WriteLine("1");
        }
        catch (FileNotFoundException ex)
        {
            Console.WriteLine(ex.Message);
        }
        if (a == null)
        {
            CreateUsingLateBinding(a);
        }
        Console.ReadLine();
    }

    private static void CreateUsingLateBinding(Assembly asm)
    {
        try
        {
            Type sportCar = asm.GetType("CarLibrary.SportCar");
            object obj = Activator.CreateInstance(sportCar);
            Console.WriteLine("Success");
            MethodInfo mi = sportCar.GetMethod("TurboBust");
            mi.Invoke(obj, null);
        }
        catch (Exception)
        { }
    }

Também criei CarLibrary.dll e coloquei-o em uma pasta.Captura de tela do ILDASM

CarLibrary ILDASM

Tudo funciona bem.Eu só tenho um algumas perguntas sobre este assunto

  • Quando é útil usar isso?
  • Se eu usar o LateBinding, suponho que não sei nada sobre o recurso que quero usar ou sei tudo sobre ele (neste caso, por que não consigo escrever programas da maneira normal, se conheço todas as classes e métodos deste recurso)?Ainda é um pouco confuso para mim - tente encontrar a resposta - resultado apenas como usar.
Foi útil?

Solução

Bem, imagine que você tem algumas aulas infantis

ex DLL A

classe pública Aluno:Pessoa { }

Dll B

classe pública Professor:Pessoa { }

A Person pode estar em um assembly comum referenciado por essas dlls e pela sua aplicação, tendo assim diferentes implementações de um método virtual etc.Usando reflexão você pode carregar todas as classes que herdam da classe Person.

public static IEnumerable<Type> GetSubclassesForType(Type baseClassType)
{
    List<Type> types = new List<Type>();
    foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies())
    {
       types.AddRange(ass.GetTypes().Where(type => type.IsSubclassOf(baseClassType)));
    }
    return types;
}

public static IEnumerable<Type> GetSubclassesForType(Assembly assembly, Type baseClassType)
{
    return from type in assembly.GetTypes() 
                        where type.IsSubclassOf(baseClassType)    
                        select type;
}

Outro uso do Late Binding é que ele pode ser usado se você deseja atualizar seu aplicativo copiando apenas a dll que contém alguma parte do seu código.Isso pode realmente ajudar quando você deseja atualizar rapidamente vários aplicativos clientes. (Observação:você também deve armazenar em cache os resultados da reflexão após o Late Binding para aumentar o desempenho)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top