H5W3
当前位置:H5W3 > 其他技术问题 > 正文

使用反射注册Action<string>事件的求助

使用反射,调用方法是会写了,注册事件搞了好久搞不定,特求助大神!

DLL代码为如下,编译为:RefTest.dll

using System;
namespace RefTest
{
public class Test
{
public event Action<string> OnMessage;
public void WriteString()
{
Console.WriteLine("Write String");
OnMessage?.Invoke("ActionMessage");
}
}
}

调用代码为:

复制代码
using System;
using System.Diagnostics;
using System.Reflection;
namespace ConsoleAppFixed
{
class Program
{
static void Main(string[] args)
{
//反射加载
Assembly assembly = Assembly.LoadFrom("RefTest.dll");      //加载程序集
Type typeClass = assembly.GetType("RefTest.Test");             //获取类型(命名空间.类名)
object obj = Activator.CreateInstance(typeClass);                  //实例化
MethodInfo method = typeClass.GetMethod("WriteString"); //查找方法
method.Invoke(obj, null);                                                      //方法调用
//注册事件
var t = typeof(Action<string>);
Delegate mDelegate = Delegate.CreateDelegate(t, obj, "OnMessage");
//这里不会注册了

Console.ReadKey();
}
public static void Recieve()
{
}
}
}
复制代码

注册接收搞不定,请大神指点,谢谢!

回答

我猜测你是想这样把:

using System;
using System.Reflection;

namespace bowen1
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.LoadFrom("./RefTest.dll"); 
            Type typeClass = assembly.GetType("RefTest.Test"); 
            object obj = Activator.CreateInstance(typeClass);
            MethodInfo method = typeClass.GetMethod("WriteString");

            var theEvent = typeClass.GetEvent("OnMessage");
            Delegate mDelegate = Delegate.CreateDelegate(typeof(Action<string>), new Program(), "Recieve");
            theEvent.AddEventHandler(obj, mDelegate);

            method.Invoke(obj, null);            

            Console.ReadKey();
        }

        public void Recieve(string message)
        {
            Console.WriteLine(message);
        }
    }
}

你对Delegate.CreateDelegate方法的理解有误

未经允许不得转载:H5W3 » 使用反射注册Action<string>事件的求助

赞 (0)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址