通过反射动态调用方法
简介
System.Reflection 命名空间包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。 这些类型还可用于操作加载类型的实例,例如挂钩事件或调用方法。
↑上边是微软 MSDN 的介绍,balabala一大堆…,总之反射调用它就对了,通过类库类名以及方法名称调用方法。
使用
通过反射运行方法
调用方法代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | 
 
 
 
 
 
 
  public static object RunMethod(string strLibraryName, string strClassName, string strMethodName, object[] parameters) {     try     {         Type type = Type.GetType($"{strLibraryName}.{strClassName}");         if (type != null)         {             var vMethod = type.GetMethod(strMethodName);             if (vMethod != null)             {                 return vMethod.Invoke(Activator.CreateInstance(type), parameters);             }         }         return null;     }     catch (Exception)     {         return null;     } }
 
  | 
 
调用方法示例
1 2
   | var parameters = new object[] { item }; RunMethod("ReflectionProject_Test", "ClassName", "MethodName", parameters);
  | 
 
通过反射接口插件式开发
定义接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | 
 
  public interface MenuPluginInterface {                    void Click();
                     string strFunctionName { get; }
                     string strFunctionGroup { get; } }
 
  | 
 
插件继承接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
   | 
 
  public class TestCommand : MenuPluginInterface {                    public void Click()     {              }
                     public string strFunctionName     {         get { return "测试功能"; }     }
                     public string strFunctionGroup     {         get { return "测试分组"; }     } }
 
  | 
 
反射方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   | 
 
 
 
 
  public static bool RunPluginClick(string strDllPath, string strClassName) {     try     {                  Assembly assembly = Assembly.LoadFrom(strDllPath);         Type type = assembly.GetType(strClassName);         if (type != null)         {             var container = new UnityContainer();             container.RegisterType<MenuPluginInterface>(new ContainerControlledLifetimeManager());             container.RegisterType(typeof(MenuPluginInterface), type);             var manager = container.Resolve<MenuPluginInterface>();             manager.Click();             return true;         }         else         {             return false;         }     }     catch (Exception)     {         return false;     } }
 
  | 
 
通过反射打开插件
1 2
   | string strProjectDll = "ReflectionProject_Test.dll"; RunPluginClick(strProjectDll, "ReflectionProject_Test.TestCommand");
   |