用dynamic类型实现反射,怎么触发事件

用dynamic类型实现反射,如何触发事件?
本帖最后由 pengwei0417 于 2015-02-27 16:20:15 编辑
dll文件的代码如下:保存在"C:\a.dll"
namespace ClassLibrary2
{
    public class Class1
    {
        public event EventHandler Event1;
        private string eventrase;
        public string Eventrase
        {
            get
            { return eventrase; }
            set
            {
                if (Event1 != null)
                    Event1(this, null);
                eventrase = value;
            }
        }

        public string returnStr(string str)
        {
            return "经过反射的:" + str;
        }
    }
}


主程序代码如下:
namespace ConsoleApplication5
{
    class Program
    {
        private static Assembly openDll;
        private static dynamic readDll;
        static void Main(string[] args)
        {
            var filename = @"C:\a.dll";
            openDll = Assembly.LoadFile(filename);
            readDll = openDll.CreateInstance("ClassLibrary2.Class1", true, BindingFlags.CreateInstance, null, null, null, null);
            //调用有返回值的方法
            Console.WriteLine(readDll.returnStr("ddd")); 
            
            //触发事件
            //readDll.Event1+=new EventHandler(EEE);
            Console.ReadKey();
        }

        //void EEE(object sender, EventArgs e)
       // {
         //   throw new NotImplementedException();
       // }
    }
}


在主程序中,利用dynamic类型成功调了returnStr方法,但如何才能触发dll文件中的事件呢?
注释掉的部分不好使,提示错误。
------解决思路----------------------
readDll.Eventrase = "给老子触发事件!" ;


介样就行了
------解决思路----------------------
反射之后不是可以获取到类的每个属性跟方法吗
------解决思路----------------------
我用button滴click 为例子写个demo,自己看吧

 dynamic t = this.button1;
 t.Click += new System.EventHandler(button1_Clicktest);

------解决思路----------------------
你又没注册事件,在你注销的那段注册方法下面添加1L的属性设置代码
------解决思路----------------------
当然你本身的代码就是对的,至于不是你想滴,那是你理解错了

t.Click +=xxxx  这块是挂接事件处理代码,而非你认为滴事件触发代码

根据你上面的对象写法,你的事件触发,应该是为Eventrase属性赋值就可以了
------解决思路----------------------

namespace ClassLibrary1
{
    public class Class1
    {
        public event EventHandler Event1;
        private string eventrase;
        public string Eventrase
        {
            get
            { return eventrase; }
            set
            {
                eventrase = value;
                if (Event1 != null)
                    Event1(eventrase, null);
            }
        }

        public string returnStr(string str)
        {
            return "经过反射的:" + str;
        }
    }
}



    class Program
    {
        private static Assembly openDll;
        private static dynamic readDll;

        static void Main(string[] args)
        {
            var filename = @"C:\a.dll";
            openDll = Assembly.LoadFile(filename);
            readDll = openDll.CreateInstance("ClassLibrary1.Class1", true, BindingFlags.CreateInstance, null, null, null, null);
            //调用有返回值的方法
            Console.WriteLine(readDll.returnStr("ddd"));

            //触发事件
            readDll.Event1 += new EventHandler(Event);
            readDll.Eventrase = "exec";
            Console.ReadKey();
        }

        private static void Event(object sender, EventArgs e)
        {
            Console.WriteLine(sender.ToString());
        }
      
    }