Reflection vs dynamic 实现反射机制
根据专案架构特点,我们的ScheduledJob需要在运行时动态的根据XML配置档呼叫已写好的DLL组件中特定的方法,这就要应用到C#反射机制。
之前采用的是C#2.0中命名空间System.Reflection特性实现的,较为繁琐,而根据C#4.0新特性dynamic 实现反射则简单的多。
下面就两种方式的实现做简单的演示:
/// <summary> /// 应用Reflection实现反射机制 /// </summary> private void beginRun() { string filePath = @"D:\ScheduledJob\DLL\ScheduleJob.dll"; string typeName = "ScheduleJob.DailyInfo"; string methodName = "SendDailyInfo"; string methodArgs = "hello,reflection"; try { Assembly a = Assembly.LoadFrom(filePath); Type type = a.GetType(typeName); object o = Activator.CreateInstance(type); MethodInfo mi = type.GetMethod(methodName, new Type[] { typeof(string) }); object objResult = mi.Invoke(o, new object[] { methodArgs }); Console.WriteLine("Done"); } catch (Exception ex) { Console.WriteLine("Cannot load Assembly " + ex.InnerException); } }
其中hardCode部分的组件路径,TypeName,MethodName等都可以写在配置档案中,根据实际情况调用即可。
下面是采用dynamic 的简单实现:
/// <summary> /// 应用C# 4.0新特性dynamic 实现反射机制 /// </summary> private void dynamicRun() { string filePath = @"D:\ScheduledJob\DLL\ScheduleJob.dll"; string typeName = "ScheduleJob.DailyInfo"; // string methodName = "SendDailyInfo"; string methodArgs = "hello,this is dynamic Demo"; try { //载入Assembly Assembly a = Assembly.LoadFrom(filePath); //应用dynamic自动实现反射 dynamic o = a.CreateInstance(typeName, false, BindingFlags.CreateInstance, null, null, null, null); //这里直接写要执行的方法和参数o.SendDailyInfo(methodArgs); } catch (Exception ex) { Console.WriteLine("Cannot run dynamic " + ex.InnerException); } }
dynamic 帮我们自动实现反射,我们要做的就是直接执行对应的方法和传入对应的参数.
需要注意的是,这里不会有智能感知,因为它需要运行时才能找到对应的方法。