目前,我试图了解有关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截图
一切正常。关于这个话题我只有几个问题
答案 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之后缓存反射结果以提高性能)