牛人请进
如何动态创建委托,比如用反射或是其他的什么技术? --------------------编程问答-------------------- 偶不是牛的人。所以,路过。--------------------编程问答-------------------- 向你学习! --------------------编程问答-------------------- 用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#