LateBinding – como usar?
-
02-01-2020 - |
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
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.
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)