搜索

C#如何通过发射获得一个对象的委托

发布网友 发布时间:2024-10-23 20:15

我来回答

5个回答

热心网友 时间:2024-11-01 15:37

反射的作用是d通过dll文件加载读取方式实例化成员
需要两个条件读取dll内部成员
要么你可以引用对象或者对象的接口
要么你需要知道方法名以及参数情况
顺便问一下,你获取里面委托干嘛,你不应该获取委托实例嘛,然后你把事件链注册到委托实例里面,确保调用是在委托里面执行,而不是调用客户端代码去执行,这样反而类型不安全了。
一句话解释,客户端代码不能调用委托定义类的委托实例,这是类型安全
委托的用法就是在调用的时候注册添加事件,然后在它自身内部调用
反射适合获取public方法信息,因为事件对外都是私有的,你只能对它的+=和-=操作,其他不能。
无论你怎么修改dll都是不行的,这是c#基于安全考虑的委托事件机制。

热心网友 时间:2024-11-01 15:38

Assembly assmble = Assembly.LoadFile(dllPath);
object obj = assmble.CreateInstance(dllType, true);
Type type = assmble.GetType(dllType);

if (type.BaseType == typeof(class))
{
object o=new object();
EventArgs e=new EventArgs();
MethodInfo method = type.GetMethod("method", new Type[] { typeof(object ),typeof(EventArgs ) });
if (method!= null)
{
method.Invoke(obj, new object[] { o, e });
}
}

Test t=(Test)obj;
t就可以拿到委托的事件追问

所说的图片代码是上面的,补充里面的图片,期待回答

    热心网友 时间:2024-11-01 15:38

    不明白你为什么一定要获得委托 可以用另外的一个委托来做桥接

    比如 事件绑定,不一定绑定的方法一定就必须得是你dll中的方法啊

    button.Click += new EventHandler(operation);

    void operation(object sender, EventArgs e)
    {
        var path = @"your dll"; //在这里你可以根据输入得到不同的dll
        //通过反射调用dll里的方法
                
    }

    这样  当button被点击的时候  根据某个条件得到不同的dll路径 然后通过反射调用里面的方法


    没看懂你到底要干什么, 提供个思路。

    另外反射开销极大,能用其它方式解决的话 反射的确毫无价值

    追问

     

    控件是自己生成的,不是画出来的,现在需要进行事件处理

    明白了吗

    再抽象一点说就是,程序根据用户输入(如dll路径等信息),会动态生成一个按钮之类的控件,是原来没有而动态创建的,而且这个按钮还是可以使用,

    由相应的dll捕获相关的事件进行相应的处理,不是单纯的调用方法,是要完成绑定事件

      追答

      动态生成个button  传入一个dll的path  在点击事件中调用这个dll的方法:

      private void GenerateButton(string path)
              {
                  var btn = new Button();
                  btn.Click += (s, e) =>
                  {
                      Assembly.LoadFrom(path);
                      //call method in your assembly
                  };
              }

      热心网友 时间:2024-11-01 15:39

      其实可以利用接口
      创建一个接口,编译成DLL, Test类实现这个接口,也编译成DLL
      主程序引用这个接口DLL
      这样的话在主程序中可以创建一个Test实例,赋给接口
      通过接口调用Test类的方法

      热心网友 时间:2024-11-01 15:39

      首先你这样写肯定不行,你的抽象一个基类出来btest,然后反射创建btest b=(btest)Assembly.Load("xxxxxx");
      b.method;就行了
      声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
      E-MAIL:11247931@qq.com
      Top