TMethod用法

TMethod用法
 

OnClick是TNotifyEvent类型;
 
type   TNotifyEvent   =   procedure(Sender:   TObject)   of   object; 

就是说他是一个过程,而且是有一个TObject的参数,并且包含在一个对象里~~ 

关于类的方法:   (不是类方法,这里指object   pascal中的静态方法,相当于C++的成员函数) 
      1:   带有隐含参数   self 
      2:   方法是方法,数据是数据。 
      3:Delphi的方法是一个结构 
            type 
                TMethod   =   record 
                    Code:   Pointer;     //方法的入口地址 
                    Data:   Pointer;     //类实例指针(Self参数) 
                end; 
  
  我们调用类的方法,其实分为2个部分, 
      1:调用方法的代码,通过类来获得方法入口地址。 
      2:访问对象的数据(也可能不访问),通过类的方法的那个隐含参数Self来访问。

我做了一个测试: 
      TMyObject   =   class 
      private 
          FName:   string; 
      public 
          procedure   ChangeName(AName:   string); 
          procedure   ShowPrivate; 
      end; 
  
  procedure   TMyObject.ChangeName(AName:   string); 
  begin 
      FName   :=   AName;   //修改私有变量 
      ShowMessage('My   name   is   to   be   changed   to   '   +   AName); 
  end; 
  
  procedure   TMyObject.ShowPrivate; 
  begin 
      ShowMessage('My   name   is   '   +   FName); 
  end; 
  
  procedure   TForm1.Button1Click(Sender:   TObject); 
  type 
      TCallFun   =   procedure(AName:   string)   of   object; 
  var 
      E:   TMyObject; 
      M:   TMethod; 
  begin 
      E   :=   TMyObject.Create; 
      M.Code   :=   @TMyObject.ChangeName;   //这里设置要访问的方法的入口地址 
      M.Data   :=   @Pointer(E)^;       //设置Self参数,即类实例指针 @Pointer(E)^与Pointer(E)一样的
      TCallFun(M)('Xbl'); 
      E.ShowPrivate;     //My   name   is   Xbl 
      E.Free; 
  end; 

### 如何在 C# 中使用反射获取 DLL 的方法列表 在 C# 中,可以通过反射机制加载外部的 DLL 文件,并从中提取类型及其方法列表。以下是实现这一功能的具体方式: #### 加载程序集 要访问 DLL 中的内容,首先需要将其作为程序集(Assembly)加载到内存中。这可以通过 `System.Reflection` 命名空间下的 `Assembly.LoadFrom` 方法完成[^1]。 ```csharp using System; using System.Linq; using System.Reflection; // 加载指定路径的DLL文件 string dllPath = @"path\to\your\dll.dll"; Assembly assembly = Assembly.LoadFrom(dllPath); ``` #### 遍历类型和方法 一旦程序集被成功加载,就可以通过遍历其类型集合来查找所需的方法。每种类型都由 `Type` 对象表示,而这些对象提供了对其成员(如字段、属性和方法)的访问能力[^2]。 ```csharp foreach (Type type in assembly.GetTypes()) { Console.WriteLine($"Type Name: {type.Name}"); // 获取当前类型的公共方法 MethodInfo[] methods = type.GetMethods(BindingFlags.Public | BindingFlags.Instance); foreach (MethodInfo method in methods) { Console.WriteLine($"\tMethod: {method.Name}"); } } ``` 上述代码片段展示了如何打印出给定 DLL 中所有公开可见的类以及它们各自的实例方法名称[^3]。 #### 调用特定方法 除了列举方法外,还可能希望实际执行某些方法。假设我们知道目标方法接受字典参数并返回字符串,则可按如下方式进行调用[^4]: ```csharp object instance = Activator.CreateInstance(type, new object[] {"constructor parameter"}); MethodInfo targetMethod = type.GetMethod("assembly_Test", BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Any, new Type[]{typeof(Dictionary<string,string>)}, null); Dictionary<string, string> inputDict = new Dictionary<string, string>(); inputDict.Add("key","value"); object result = targetMethod.Invoke(instance, new object[] { inputDict }); Console.WriteLine(result.ToString()); ``` 以上示例说明了创建类实例的过程,定位具体方法签名的方式,最后演示了传递适当参数以触发该方法的实际操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值