首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 等级考试 > 复习指导 >

由C++转向C#需要注意的变化(5)(2)

2009-03-06 
二级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对象的数组,代码下所示:
  属性的打印
  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);
  }
  }
  类型发现
  我们可以通过映象的方法来研究一个组合实体的内容,如果要建立需要显示组合体内部信息的工具或动态地调用组合体中的途径,这一方法是非常有用的。
  通过映象的方法,我们可以知道一个模块、方法、域、属性的类型,以及该类型的每个方法的信号、该类支持的界面和该类的超级类。我们可以通过如下的形式,用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个项。
  对一种类型映射我们也可以对组合体中一种类型进行映射。为此,我们可以使用GetType方法从组合体中解析出一个类型:
  publicclassTester
  {
  publicstaticvoidMain()
  {
  //检查一个对象
  TypetheType=Type.GetType("System.Reflection.Assembly");
  Console.WriteLine("\nSingleTypeis{0}\n",theType);
  }
  }
  输出如下所示:
  SingleTypeisSystem.Reflection.Assembly
  发现成员
  我们还可以得到所有成员的类型,显示所有的方法、属性、域,下面的代码演示了实现上述目标的代码。
  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
  System.StringCopiedCodeBaseisaProperty

 

3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/

热点排行