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