3s8首页  | 新闻 | GIS | GPS | RS | 测绘测量 | 资料下载 | 开发语言 | 数据库 | CAD | 求职招聘 | 物流交通 | 论坛 | 博客 | RSS订阅 网站地图 
中国3S吧
首页 | | Java语言 | VC/VC.Net | VB/VB.Net | C/C++ | 书籍教程 |

由C++转向C#需要注意的问题(三)


 日期:2007-05-15 论坛交流

本文检索关键字:C++ C#

映射

 

在许多情况下,我们需要一种方法,能够从元数据中访问属性,C#提供了对映射的支持以访问元数据。通过初始化MemberInfo类型对象,System.Reflection名字空间中的这个对象可以用来发现成员的属性,对元数据进行访问。 

System.Reflection.MemberInfoinf=typeof(MyMath); 

对MyMath类型调用typeof操作符,它返回一个由继承MemberInfo而生成的Type类型的变量。 

下一步是对MemberInfo对象调用GetCustomAttributes,并将希望得到的属性的类型作为一个参数传递给GetCustomAttributes。我们将得到一个对象数组,数组的每个成员的类型都是BugFixAttribute。 

object[]attributes;

attributes=Attribute.GetCustomAttributes(inf,typeof(BugFixAttribute)); 

我们就可以遍历这个数组了,打印BugFixAttribute对象的数组,代码下所示: 专业的3S站 3s8.cn

属性的打印 中国3S吧 3s8.cn

publicstaticvoidMain()

{

MyMathmm=newMyMath();

Console.WriteLine("CallingDoFunc(7).Result:{0}",

mm.DoFunc1(7));

//获取成员信息并使用它访问自定义的属性

System.Reflection.MemberInfoinf=typeof(MyMath);

object[]attributes;

attributes=

Attribute.GetCustomAttributes(inf,typeof(BugFixAttribute));

//遍历所有的属性

foreach(Objectattributeinattributes)

{

BugFixAttributebfa=(BugFixAttribute)attribute;

Console.WriteLine("\nBugID:{0}",bfa.BugID);

Console.WriteLine("Programmer:{0}",bfa.Programmer);

Console.WriteLine("Date:{0}",bfa.Date);

Console.WriteLine("Comment:{0}",bfa.Comment);

} } 

类型发现 

我们可以通过映象的方法来研究一个组合实体的内容,如果要建立需要显示组合体内部信息的工具或动态地调用组合体中的途径,这一方法是非常有用的。 

中国3S吧 3s8.cn



通过映象的方法,我们可以知道一个模块、方法、域、属性的类型,以及该类型的每个方法的信号、该类支持的界面和该类的超级类。我们可以通过如下的形式,用Assembly.Load静态方法动态地加载一个组合体: 

publicstaticAssembly.Load(AssemblyName) 

然后,可以将它传递到核心库中。 

Assemblya=Assembly.Load("Mscorlib.dll"); 

一旦加载了组合体,我们可以通过调用GetTypes返回一个Type对象数组。Type对象是映射的核心,它表示类、界面、数组、值和枚举等的类型定义。 

Type[]types=a.GetTypes(); 

组合休会返回一个类型的数组,我们可以使用foreach-loop结构显示该数组,其输出将有好几页文档之多,下面我们从中找一小段: 

TypeisSystem.TypeCode

TypeisSystem.Security.Util.StringExpressionSet

TypeisSystem.Text.UTF7Encoding$Encoder

TypeisSystem.ArgIterator

TypeisSystem.Runtime.Remoting.JITLookupTable

1205typesfound 

我们得到了一个内容为核心库中类型的数组,可以将它们都打印出来,该数组将有1205个项。  中国3S吧 3s8.cn

对一种类型映射我们也可以对组合体中一种类型进行映射。为此,我们可以使用GetType方法从组合体中解析出一个类型: 

publicclassTester

{

publicstaticvoidMain()

{

//检查一个对象

TypetheType=Type.GetType("System.Reflection.Assembly");

Console.WriteLine("\nSingleTypeis{0}\n",theType);

}



输出如下所示: 

SingleTypeisSystem.Reflection.Assembly 

发现成员 中国3S吧 3s8.cn

我们还可以得到所有成员的类型,显示所有的方法、属性、域,下面的代码演示了实现上述目标的代码。 

Figure9GettingAllMembers

publicclassTester

{

publicstaticvoidMain()

{

//检查一个单一的对象

TypetheType=Type.GetType("System.Reflection.Assembly");

Console.WriteLine("\nSingleTypeis{0}\n",theType);

//获取所有的成员

MemberInfo[]mbrInfoArray=

theType.GetMembers(BindingFlags.LookupAll);

foreach(MemberInfombrInfoinmbrInfoArray)

{

Console.WriteLine("{0}isa{1}",

mbrInfo,mbrInfo.MemberType.Format());

} }



尽管得到的输出还非常长,但在输出中我们可以得到如下面的不甘落后民示的域、方法、构造器和属性: 

System.Strings_localFilePrefixisaField

BooleanIsDefined(System.Type)isaMethod

Void.ctor()isaConstructor

System.StringCodeBaseisaProperty 专业的3S站 3s8.cn

System.StringCopiedCodeBaseisaProperty 

只发现方法 

共2页: 上一页 1 [2] 下一页

上一篇:由C++转向C#需要注意的问题(二)   下一篇:“数字城市”离中国还有多远?



用户名: 新注册) 密码: 匿名评论 [所有评论]
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • C#连接六类数据库的代码集
    本文列出了C#连接Access、SQL Server、Oracle、MySQL、DB2和SyBase六种不同数据库的程
  • 用c#读文件
    usingSystem; usingSystem.IO; usingSystem.Collections; classAnagrams { publicstat
  • C#语言基础常见问题汇总
    概述 1.什么是C#? C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++,并且有
  • C#加密与解密
    usingSystem; usingSystem.IO; usingSystem.Security.Cryptography; usingSystem.Text
  • C#四种排序算法
    本文介绍了C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序