LateBinding - 如何使用它?

时间:2013-11-18 18:18:38

标签: c# .net-4.5 late-binding

目前,我试图了解有关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并将其放在一个文件夹中。 ILDASM截图

CarLibrary ILDASM

一切正常。关于这个话题我只有几个问题

  • 什么时候使用它?
  • 如果我使用LateBinding,我认为我不知道任何关于我想要使用的资源,或者我知道它的一切(在这种情况下,为什么我不能以正常方式编写程序,如果我知道每一个来自这个资源的类和方法)?这对我来说仍然有点混乱 - 试着找到答案 - 结果只是如何使用。

1 个答案:

答案 0 :(得分:1)

好吧,想象一下你有一些子课程

ex Dll A

公共班学生:人{}

Dll B

公共课老师:人{}

Person可以位于这些dll和您的应用程序引用的公共程序集中,因此具有虚拟方法的不同实现等。使用反射,您可以加载从类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;
}

Late Binding的另一个用途是,如果您只想复制包含代码某些部分的dll来更新应用程序,则可以使用它。当您想要快速更新多个客户端应用程序时,这确实有用。(注意:您还应该在Late Binding之后缓存反射结果以提高性能)