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;就行了