当前位置:编程学习 > C#/ASP.NET >>

牛人请进

如何动态创建委托,比如用反射或是其他的什么技术? --------------------编程问答-------------------- 偶不是牛的人。所以,路过。
  

--------------------编程问答-------------------- 向你学习! --------------------编程问答-------------------- 用C#中的事件机制就可以实现动态委托了
具体要看你要实现什么功能,以及你的需求变化点是什么。 --------------------编程问答-------------------- 不会,mark --------------------编程问答-------------------- 动态创建一个delegate的定义还是动态创建他的一个实例?

如果是前者:需要用CodeDom生成一个从MulticastDelegate继承的类;然后给他加上Invoke, BeginInvoke和EndInvoke三个方法,标注[MethodImpl(0, MethodCodeType=MethodCodeType.Runtime)]

如果是后者,调用Delegate.CreateDelegate方法。
--------------------编程问答-------------------- 俺写过的例子
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;
using ICSharpCode.SharpZipLib.Zip;
using System.Threading;


namespace zipTest
{

    public partial class Form1 : Form
    {
        public delegate void MyProcesses(int idx, int donecount);

        public Form1()
        {
            InitializeComponent();
        }

        private void Processes(int idx, int donecount)
        {
            listView1.Items[idx].SubItems[2].Text = donecount.ToString();
        }

        private void OnProcesses(int idx, int donecount)
        {  
            lock (this.listView1)
            {
                object[] pList = { idx, donecount };
                MyProcesses mi = new MyProcesses(this.Processes);
                listView1.BeginInvoke(mi, pList);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            listView1.Items.Clear();
            for (int i = 0; i < 5; i++)
            {
                ListViewItem item = new ListViewItem();
                item.Text = i.ToString();
                item.SubItems.Add("10");
                item.SubItems.Add("0");

                listView1.Items.Add(item);

                ZipTh th = new ZipTh(i, 10);
                th.Processes += new OnProcesses(OnProcesses);

                th.StartThread();
            }
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
    public delegate void OnProcesses(int idx,int donecount);
    public class ZipTh
    {
        private int idx;
        private int count;
        public event OnProcesses Processes;

        public ZipTh(int i, int c)
        {
            idx = i;
            count = c;
        }

 

        public void doProcesses(int i, int c)
        {
            Processes(i, c);
        }
        public void Run()
        {
            int donecount = 0;
            for (int i = 0; i < count; i++)
            {
                ICSharpCode.SharpZipLib.Zip.FastZip zip = new ICSharpCode.SharpZipLib.Zip.FastZip();
                zip.CreateEmptyDirectories = true;
                zip.CreateZip(@"c:\" + idx.ToString() + @".zip", @"C:\temp", true, null);
                donecount++;


                doProcesses(idx,donecount);
            }
         
        }

        public void StartThread()
        {
            Thread newThread;
            newThread = new Thread(new ThreadStart(Run));
            newThread.Start();
        }

    }
} --------------------编程问答-------------------- 找我做甚 --------------------编程问答-------------------- up --------------------编程问答-------------------- 同意qqchen79(知秋一叶)
如果是动态定义用CodeDom,如果是动态创建用Delegate,如果是动态调用用reflection
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,