动态创建与调用 实际上映射远不止动态地获知组件的类型信息,它还能在获得类型信息的基础上,在代码运行时进行类型的动态创建与方法的动态调用,甚至动态地创建并执行IL代码! 动态调用为C#的组件提供了迟绑定功能,它使组件之间在运行时集成变得极为方便!利用前面创建的简单组件SimpleType.dll,来看一看怎样完成对象的动态创建和方法的动态调用: // DynamicExe.cs using System; using System.Reflection; class Test { public static void Main(){ Assembly a=Assembly.LoadFrom(“SimpleType.dll”); //装载组件 foreach(Type t in a.GetTypes()){ if(t.IsClass && !t.IsAbstract) { MethodInfo[] miArr= t.GetMethods(); //获得类型的公有方法 object o=Activator.CreateInstance(t); //创建实例(无参构造器) foreach(MethodInfo mi in miArr) { if(!mi.IsAbstract && !mi.IsStatic && mi.GetParameters().Length==0) { object re=mi.Invoke(o,null);//调用实例方法 Console.WriteLine(“{0} , Return :{1}”,mi.Name,re); } } } } } } 用编译命令csc /r:simpletype.dll dynamicexe.cs编译后执行,可得到下面的输出: GetHashCode, Return :8 ToString, Return :MyClass get_Count, Return :100 100 Print, Return : GetType, Return :MyClass 我们在上面的例子中给出了被动态调用的方法名字和返回值。其中输出的第四行为100,它是动态调用方法MyClass.Print() 的输出。需要指出的是调用的是类型的公有无参数实例方法。给出组件的名字,应用Assembly.LoadFrom,我们便可以动态地装载组件。Activator.CreateInstance允许动态地创建类型(这里只通过无参数的构造器来创建),实际上用它创建出来的类型和用“MyClass o=new MyClass()”创建出来的类型一样。进而,还可以在查询到的成员的基础上,对它们进行动态调用。 Microsoft.NET从底层的元数据设计入手,为映射机制提供了非常坚实的基础。命名空间System.Reflection和System.Reflection.Emit为操作这种映射提供了实实在在的强大的API编程接口,大大改善了组件的设计环境,提高了组件的交互能力!
---------------------------摘自计算机世界报
---------------------------摘自计算机世界报
解决方案 »
- c# datagridview xml
- OWC11画曲线+条形图
- 我想做一个下载系统,怎样做一个像迅雷那样,可以在用户已经下载过的URL,提示"该URL已经存在!"
- treeview 数据绑定
- 为什么按照教程一步步写的代码老是会出现sda.Fill(ds,"emp")的错误
- 在datagrid中实现点击单元格并配合ctrl来多选
- richTextBox如何保存图文混合文件,如何打开?
- arraylist.add(类的实例化对象) 然后保存的问题?求助!
- 如何在程序中调用一个dll文件啊???
- 关于.net中用session丢失的问题 急!!!!!
- 如果解决这个问题,请大家共同来帮忙,来者有分!!!
- 这是我作的,本来想实现点对点的聊天程序, 只实现了简单的消息发送,贴出来,请大家指正!!
http://www.icsharpcode.net/OpenSource/SD/default.asp
SharpDevelop是一个用.Net开发的.Net开发环境,
并提供源码。
能具体说说你要什么功能吗? >>对于控件的命名处理和事件处理应该怎么做了,请给点思路
没有太明白 :)
public class TestForm : Form
{
private strng strConn;
private Button btnShow;
...... public TestForm()
{
strConn=""; //数据库连接字符串
btnShow.click += new eventhandle(btnShowClick);
} private void btnShowClick(object this, eventargs e)
{
//操作
}
}