C#中的反射?是怎么一回事? 看了一下MSDN中所说的,不太明白。好像就是得到类型那样?请各位用一些方法讲解一下。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单的说,就是用字符串来表示实际的类,这样在程序运行的时候就可以动态new出实例来了 例子:应用反射获取当前执行的程序集中的模块信息,类型信息,成员信息,并显示模块,类型和成员的名称。protected void Page_Load(object sender,EventArgs e){ ///获取程序集,并输出程序集的模块,类型,成员信息 foreach(Module m in Assembly.GetExecutingAssembly().GetModules()) { ///输出模块信息 Response.Write("Module:"+m.name+" <br> "); foreach(Type in m.GetTypes()) { ///输出类型信息 Response.Write("Type:"+t.name+"<br>"); foreach(MemberInfo mi in t.GetMembers()) {///输出成员信息 Response.Write("MemberInfo:"+mi.name+"<br>"); } } } Response.End();} using System;using System.Collections.Generic;using System.Threading;using System.Reflection;using System.Reflection.Emit;namespace PCTools{ public class MyEnumBuilder { static AssemblyBuilder myAssemblyBuilder; static ModuleBuilder myModuleBuilder; static EnumBuilder myEnumBuilder; public static void Main() { //创建:程序集名 AssemblyName myAssemblyName = new AssemblyName(); myAssemblyName.Name = "EnumColor"; //创建:程序集 myAssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.Save); //创建:模块 myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("EmittedModule","EmittedModule.mod"); //创建:枚举 myEnumBuilder = myModuleBuilder.DefineEnum("MyNamespace.EnumColor",TypeAttributes.Public, typeof(Int32)); //创建:类型元数据 myEnumBuilder.DefineLiteral("Red", 1); myEnumBuilder.DefineLiteral("Green",2); //创建:类型 myEnumBuilder.CreateType(); //创建:程序 myAssemblyBuilder.Save("EnumColor.dll"); //End Console.WriteLine("EnumColor Created!"); } }} 楼主 建议看下: c#插件开发 方面的资料一个插件相当于一个dll文件主程序调用这个dll文件,不是手动引用,他会通过反射得到dll 类型。从而创建这个类对象加以使用一般模式:主程序(空窗体,通过接口加载插件)----接口(被主程序引用,被插件继承)----插件(可以是任何c#程序,必须实现接口) 楼主可用过winform的dataGridView?? 绑定一个表到dataGridView , 他会根据datatable的columns在dataGridView里面自动生成列, 楼主觉得dataGridView凭什么知道他的数据源有那个列并且就叫那个列名??dataGridView在设计的时候是不知道将来所用到的数据源是什么 但是不管是哪个表 都能正确显示这就是反射 反射簡單來講就是程序運行過程中,可以動態獲取載入內存中的類型對應信息,主要為Type對應的MetaData,MethodsTable,Parameters,Properties等等。具體可以找本書自己體會,這個東西還是要從實踐中來 我从一个DLL中得到类型后,如果用这个类型来创建对象,并调用这个类型对象的方法? 我目前项目中有用到的例子,如下在XML中有实体类的各属性的值在程序运行过程我通过 实体类对象.GetType().GetProperties()取得对象的所有属性的集合properties。然后在XML节点中循环(节点名称与实体类属性名称一致)properties[节点名]=节点的值还可以取得类的方法集合,再通过名称取得方法,然后调节,从而达到动态调用的目的。用多了就自然理解了。 还是不太懂……做了一个DLL,类可以检测出来,但如何用加载的类建立对象呢? http://hi.baidu.com/zsq811122/blog/item/91900513de20d3d7f7039ee8.html 一个简单的wpf问题 请教算法高手~ 软件怎么跟音频结合呢 获取input标签内容 在使用Entity Framework时,删除某个表的一条记录然后又增加相同记录时,报错 移动画在winform上的东西可行吗? 关于事务调用 急 通过Socket中如何获取客户端的IP地址? 新手求教,为什么new找不到控件? IO读、写文件异常 C# Sql2005 查询语句问题,虽然简单但不知道错在那 (重赏)SHDocvw.WebBrowser截获IE下载的问题
应用反射获取当前执行的程序集中的模块信息,类型信息,成员信息,并显示模块,类型和成员的名称。protected void Page_Load(object sender,EventArgs e)
{
///获取程序集,并输出程序集的模块,类型,成员信息
foreach(Module m in Assembly.GetExecutingAssembly().GetModules())
{ ///输出模块信息
Response.Write("Module:"+m.name+" <br> ");
foreach(Type in m.GetTypes())
{
///输出类型信息
Response.Write("Type:"+t.name+"<br>");
foreach(MemberInfo mi in t.GetMembers())
{///输出成员信息
Response.Write("MemberInfo:"+mi.name+"<br>");
}
}
}
Response.End();
}
using System.Collections.Generic;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;namespace PCTools
{
public class MyEnumBuilder
{
static AssemblyBuilder myAssemblyBuilder;
static ModuleBuilder myModuleBuilder;
static EnumBuilder myEnumBuilder; public static void Main()
{
//创建:程序集名
AssemblyName myAssemblyName = new AssemblyName();
myAssemblyName.Name = "EnumColor"; //创建:程序集
myAssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(myAssemblyName,AssemblyBuilderAccess.Save); //创建:模块
myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("EmittedModule","EmittedModule.mod"); //创建:枚举
myEnumBuilder = myModuleBuilder.DefineEnum("MyNamespace.EnumColor",TypeAttributes.Public, typeof(Int32)); //创建:类型元数据
myEnumBuilder.DefineLiteral("Red", 1);
myEnumBuilder.DefineLiteral("Green",2); //创建:类型
myEnumBuilder.CreateType(); //创建:程序
myAssemblyBuilder.Save("EnumColor.dll"); //End
Console.WriteLine("EnumColor Created!");
}
}
}
一般模式:主程序(空窗体,通过接口加载插件)----接口(被主程序引用,被插件继承)----插件(可以是任何c#程序,必须实现接口)
绑定一个表到dataGridView , 他会根据datatable的columns在dataGridView里面自动生成列,
楼主觉得dataGridView凭什么知道他的数据源有那个列并且就叫那个列名??
dataGridView在设计的时候是不知道将来所用到的数据源是什么 但是不管是哪个表 都能正确显示
这就是反射
在程序运行过程我通过 实体类对象.GetType().GetProperties()取得对象的所有属性的集合properties。
然后在XML节点中循环(节点名称与实体类属性名称一致)
properties[节点名]=节点的值还可以取得类的方法集合,再通过名称取得方法,然后调节,从而达到动态调用的目的。用多了就自然理解了。