C#通過反射,創(chuàng)建窗體與控件之間的通訊,不需要引用dll

C#通過反射,創(chuàng)建窗體與控件之間的通訊,不需要引用dll,我使用的是把dll轉(zhuǎn)成內(nèi)存流直接通過反射加載到窗體中.
前提是需要知道對應的事件,或者執(zhí)行方法,廢話不多說開整
控件代碼:

    public partial class UserUC : UserControl
    {
        private static UserUC user;//不加這一句靜態(tài)方法中沒辦法訪問自己的控件
        public UserUC()
        {
            UserUC= this;//不加這一句靜態(tài)方法中沒辦法訪問自己的控件
            InitializeComponent();
        }
        public delegate void 插件代理(List<string> str);
        public static event 插件代理 發(fā)送消息給主窗體;
        public static void 發(fā)送消息(List<string> str)
        {
            插件代理 handler = 發(fā)送消息給主窗體;
            if (handler != null)
            {
                handler(str);
            }
        }

        public static void 主窗體消息(List<string> str)
        {
            if (str.Count > 0)
            {
                var str1 = "";
                foreach (var a in str)
                {
                    str1 += a + "\n";
                }
                MessageBox.Show(str1, "這是一條由主窗體發(fā)來的消息");
                UserUC.消息欄.Text = str1;//這里的控件由自己定義,能顯示消息就行
            }
        }
        private void 發(fā)送消息給主窗體_Click(object sender, EventArgs e)
        {
            var a = new List<string>();
            a.Add("這是第一條測試信息");
            a.Add("這是第二條測試信息");
            a.Add("這是第三條測試信息");
            Plugin消息(a);
        }
    }

窗體代碼:

//窗體中綁定的執(zhí)行代碼
        public static void MainWindowInfo(List<string> str)
        {
            if (str.Count > 0)
            {
                var str1 = "";
                foreach (var a in str)
                {
                    str1 += a + "\n";
                }
                MessageBox.Show(str1, "這是一條由子窗體發(fā)來的消息");
            }
        }
//窗體中代理和事件
        public delegate void 插件推送代理(List<string> str);
        public static event 插件推送代理 推送通知;
        public static void 推送消息給子窗體(List<string> str)
        {
            插件推送代理 handler = 推送通知;
            if (handler != null)
            {
                handler(str);
            }
        }
        /// <summary>
        /// 窗體與控件之間 委托事件互相綁定雙向通信
        /// </summary>
        public static UserControl ModulEventMutualCommunication(Form 當前的窗體, string 目標委托事件名稱, string 當前窗體執(zhí)行事件名稱, string 當前窗體目標委托事件名稱, string 目標綁定執(zhí)行事件名稱, MemoryStream 內(nèi)存流, List<string> 目標事件參數(shù), List<string> 自身事件參數(shù))
        {
            var lUc = new UserControl();
            if (目標委托事件名稱 == null  && 當前窗體執(zhí)行事件名稱 == null)
                throw new ArgumentNullException("目標委托事件名稱錯誤");
            if (當前窗體目標委托事件名稱 == null && 目標綁定執(zhí)行事件名稱 == null)
                throw new ArgumentNullException("綁定執(zhí)行事件名稱錯誤");
            if (內(nèi)存流 == null)
                throw new ArgumentNullException("內(nèi)存流錯誤");
            if (目標事件參數(shù) == null && 自身事件參數(shù) == null)
                throw new ArgumentNullException("目標事件參數(shù)錯誤");
            try
            {

                byte[] buff = 內(nèi)存流.ToArray();
                Assembly assembly = Assembly.Load(buff);
                Type[] type = assembly.GetTypes();
                foreach (Type t in type)
                {
                    //反射執(zhí)行的成員和類型搜索
                    const BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Public;
                    //獲取類型里面的事件信息
                    EventInfo eventInfo = t.GetEvent(目標委托事件名稱, myBindingFlags);
                    EventInfo 當前窗體eventInfo = 當前的窗體.GetType().GetEvent(當前窗體目標委托事件名稱, myBindingFlags);
                    //獲取到當前的類
                    var obj = (UserControl)assembly.CreateInstance(t.FullName);
                    if (eventInfo != null && 當前窗體eventInfo != null)
                    {
                        Type tDelegate = eventInfo.EventHandlerType;
                        Type 當前窗體Delegate = 當前窗體eventInfo.EventHandlerType;
                        //獲取執(zhí)行事件信息
                        MethodInfo methodHandler = t.GetMethod(目標綁定執(zhí)行事件名稱, myBindingFlags);
                        MethodInfo 當前methodHandler = 當前的窗體.GetType().GetMethod(當前窗體執(zhí)行事件名稱, myBindingFlags);
                        //子窗體委托給當前窗體
                        Delegate d = Delegate.CreateDelegate(tDelegate, 當前methodHandler);
                        //當前窗體委托給子窗體
                        Delegate dd = Delegate.CreateDelegate(當前窗體Delegate, methodHandler);
                        //獲取將要處理的事件委托
                        MethodInfo minAddHandler = eventInfo.GetAddMethod();
                        MethodInfo 當前窗體minAddHandler = 當前窗體eventInfo.GetAddMethod();
                        object[] addHandlerArgs = { d };
                        object[] 當前窗體addHandlerArgs = { dd };
                        //調(diào)用
                        minAddHandler.Invoke(obj, addHandlerArgs);
                        當前窗體minAddHandler.Invoke(當前的窗體, 當前窗體addHandlerArgs);
                        //集合信息
                        FieldInfo field = t.GetField(目標委托事件名稱, myBindingFlags);
                        FieldInfo 當前窗體field = 當前的窗體.GetType().GetField(當前窗體執(zhí)行事件名稱, myBindingFlags);
                        if (field != null && 當前窗體field != null)
                        {
                            Object fieldValue = field.GetValue(obj);
                            Object 當前窗體fieldValue = 當前窗體field.GetValue(當前的窗體);
                            if (fieldValue != null && fieldValue is Delegate)
                            {
                                Delegate objectDelegate = fieldValue as Delegate;
                                //動態(tài)調(diào)用
                                objectDelegate.DynamicInvoke(目標事件參數(shù));
                                Delegate 當前窗體objectDelegate = 當前窗體fieldValue as Delegate;
                                //動態(tài)調(diào)用
                                當前窗體objectDelegate.DynamicInvoke(自身事件參數(shù));
                            }
                        }
                    }
                    lUc = obj;
                }
                return lUc;
            }
            catch (FileNotFoundException)
            {
                MessageBox.Show("沒有找到相應的模塊", "提示!");
                return lUc;
            }
            catch (TargetParameterCountException)
            {
                MessageBox.Show("調(diào)用模塊時發(fā)現(xiàn)委托的參數(shù)不同挑秉!請檢查參數(shù)的個數(shù)", "插件提示!");
                return lUc;
            }
            catch (Exception)
            {
                //MessageBox.Show("插件異常提示闹获!");
                return lUc;
            }

調(diào)用:

var usercontrol = ModulEventMutualCommunication(this, "發(fā)送消息給主窗體", "MainWindowInfo", "推送通知", "MainView消息", ss, new List<string>() { "窗體加載成功" }, new List<string>() { "消息推送" });
usercontrol.Dock = DockStyle.Fill;
窗體容器.Controls.Add(usercontrol);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躺彬,一起剝皮案震驚了整個濱河市通危,隨后出現(xiàn)的幾起案子浪谴,更是在濱河造成了極大的恐慌瘪匿,老刑警劉巖萨赁,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柑蛇,死亡現(xiàn)場離奇詭異芥挣,居然都是意外死亡,警方通過查閱死者的電腦和手機耻台,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門空免,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盆耽,你說我怎么就攤上這事蹋砚。” “怎么了摄杂?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵坝咐,是天一觀的道長。 經(jīng)常有香客問我析恢,道長墨坚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任映挂,我火速辦了婚禮泽篮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柑船。我一直安慰自己帽撑,他們只是感情好,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布鞍时。 她就那樣靜靜地躺著亏拉,像睡著了一般历恐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上专筷,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天弱贼,我揣著相機與錄音,去河邊找鬼磷蛹。 笑死吮旅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的味咳。 我是一名探鬼主播庇勃,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼槽驶!你這毒婦竟也來了责嚷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤掂铐,失蹤者是張志新(化名)和其女友劉穎罕拂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體全陨,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡爆班,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辱姨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柿菩。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖雨涛,靈堂內(nèi)的尸體忽然破棺而出枢舶,到底是詐尸還是另有隱情,我是刑警寧澤替久,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布凉泄,位于F島的核電站,受9級特大地震影響侣肄,放射性物質(zhì)發(fā)生泄漏旧困。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一稼锅、第九天 我趴在偏房一處隱蔽的房頂上張望吼具。 院中可真熱鬧,春花似錦矩距、人聲如沸拗盒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陡蝇。三九已至痊臭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間登夫,已是汗流浹背广匙。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恼策,地道東北人鸦致。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像涣楷,于是被迫代替她去往敵國和親分唾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容