目前我试图了解关于C#中的编程的一些方面。现在我正在学习生成的世代。我了解如何创建一些简单的程序,如下面的那个。

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并将它放在一个文件夹中。illyasm screenshot

所有工作都很好。我只是有一个几个问题这个主题

  • 当它有用它使用它?
  • 如果我使用乳胶是它认为我对我想要使用的资源都不了解任何关于它的资源(在这种情况下,为什么我只能以正常方式编写程序,如果我知道来自此资源的类和方法)?对我来说仍然有点困惑 - 试着找到答案 - 结果只有如何使用。
有帮助吗?

解决方案

嗯,想象一下你有一些儿童课程

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