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!");
}
}
}
感觉设计有问题,这样恐怕不行(个人以为)
PushDateTime 要放到公共的地方 C,调用者A引用C, 被调用者B也需要引用C.这样PushDateTime才意义。
最好,C里再定义一个接口。B去实现。
A只创建实例之就跟本地写法一样,像这样 :
ITest obj =(ITest) Activator.CreateInstance(type);
obj.PushDateTime=xxx
obj.Send()
这个我会,但...讲起来有点麻烦。
我只能给你一些提示:
1、你可以通过设置断点/打印信息的方式,了解一下Assembly、Type、FieldInfo等类型的结构
2、委托是一个泛型class
3、如果需要外部方法转换成PushDateTime这个委托,你可以通过Delegate这个类,这个类下面有一个创建委托的函数。
4、委托本质就是特殊类,这个类,包含目标方法的具体实例object和MethodInfo。调用委托,本质就是调用这个类的Invoke方法。然后这个Invoke进行:MthodInfo.Invoke(object,....)
言尽于此。