首页 新闻 搜索 专区 学院

动态调用DLL中的委托

0
悬赏园豆:10 [待解决问题]

namespace Test
{
public delegate void PushDateTime(DateTime dateTime);

public class Class1
{
    public PushDateTime PushDateTime;

    public Class1()
    {

    }
    public void Send()
    {
        while (true)
        {
            PushDateTime?.Invoke(DateTime.Now);
        }
    }
}

}

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom("Test.dll");
var type = assembly.GetType("Test.Class1");
object obj = Activator.CreateInstance(type);
var fieldInfo = type.GetField("PushDateTime");
//下来不知道怎么写了

        Console.WriteLine("Hello World!");
    }
}

}

浪潮之巅的主页 浪潮之巅 | 初学一级 | 园豆:83
提问于:2021-02-27 18:58
< >
分享
所有回答(3)
0

感觉设计有问题,这样恐怕不行(个人以为)

Jeffcky | 园豆:2589 (老鸟四级) | 2021-02-27 23:42
0

PushDateTime 要放到公共的地方 C,调用者A引用C, 被调用者B也需要引用C.这样PushDateTime才意义。
最好,C里再定义一个接口。B去实现。
A只创建实例之就跟本地写法一样,像这样 :
ITest obj =(ITest) Activator.CreateInstance(type);
obj.PushDateTime=xxx
obj.Send()

pencile | 园豆:793 (小虾三级) | 2021-03-01 13:48
0

这个我会,但...讲起来有点麻烦。
我只能给你一些提示:
1、你可以通过设置断点/打印信息的方式,了解一下Assembly、Type、FieldInfo等类型的结构
2、委托是一个泛型class
3、如果需要外部方法转换成PushDateTime这个委托,你可以通过Delegate这个类,这个类下面有一个创建委托的函数。
4、委托本质就是特殊类,这个类,包含目标方法的具体实例object和MethodInfo。调用委托,本质就是调用这个类的Invoke方法。然后这个Invoke进行:MthodInfo.Invoke(object,....)

言尽于此。

TidyScript | 园豆:294 (菜鸟二级) | 2021-03-13 23:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册