Вопрос

В настоящее время я пытаюсь понять некоторые из аспектов, касающихся программирования в C #.Теперь я изучаю LateBinding.Я понимаю, как создать некоторую простую программу, как приведенная ниже.

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)
        { }
    }
.

Я также создал Carlibrary.dll и поместите его в одну папку.Скриншот Iildasm

Carlibrary Ildasm

Все все работает нормально.У меня просто есть <крепкие> несколько вопросов относительно этой темы

    .
  • Когда это полезно использовать это?
  • Если я использую задержание, это предполагает, что я ничего не знаю о ресурсах, который я хочу использовать или я знаю все об этом (в этом случае, почему я просто не могу написать программу нормально, если я знаю каждыйКласс и метод от этого ресурса)?Это все еще немного запутащее для меня - попробуйте найти ответ - привести только как использовать.
Это было полезно?

Решение

Ну, представьте, что у вас есть некоторые детские классы

ex dll a

Студент общественного класса: человек {}

dll b

Учитель общественного класса: человек {}

Человек может быть в общем собрании, на который ссылаются эти DLL и ваша заявка, при этом разные реализации виртуального метода и т. Д. Использование отражения Вы можете загрузить все классы, которые наследуют от класса.

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;
}
.

Другое использование позднего привязки - это то, что его можно использовать, если вы хотите обновить свое приложение, только копирование DLL, которая содержит некоторую часть вашего кода.Это может действительно помочь, когда вы хотите обновить быстрые несколько клиентских приложений. (Примечание: вы также должны кэшировать результаты отражения после позднего привязки для повышения производительности)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top