Visual C++ 2005新特性之动态编程

1、  反射(Reflection

1)类型发现

Assembly^ a = Assembly::Load(args[1]);          //通过程序集名称来加载程序集

array<Type^>^ types = a->GetTypes();            //获取程序集中定义的各种类型

IEnumerator^ typeIter = types->GetEnumerator();   //获取类型枚举器

While(typeIter->MoveNext())                   //遍历类型枚举器

{

Type^ t = dynamic_cast<Type^>((typeIter->Current);     //动态转换来获取当前类型

Console::WriteLine(“{0}”,t->ToString());

array<MemberInfo^>^ members = t->GetMembers();     //获取类型中定义的各个成员

IEnumerator^ memberIter = members->GetEnumerator();  //获取成员枚举器

While(memberIter->MoveNext())                     //遍历成员枚举器

{

    //动态转换来获取当前成员

MemberInfo^ mi= dynamic_cast<MemberInfo^>((memberIter->Current);

Console::WriteLine(“{0}”,mi->ToString());

}

}

2)类型操作

Ref struct A              //定义一个引用类型

{

Void Method()

{

    Console::WriteLine(“A::Method()”);

}

};

A^ bjA = gcnew A;             //创建一个对象实例

Type^ typeA = objA->GetType();                       //获取对象实例类型

MemberInfo^ methodA = typeA->GetMethod(“Method”);   //获取类型中的方法

methodA->Invoke(objA,nullptr);   //动态绑定,objA表示对象实例,nullptr表示方法不需要参数

 

Assembly^ plugAssembly = Assembly::Load(args[1]);   //通过程序集名称来加载程序集

array<Type^>^ types = plugAssembly->GetTypes();    //获取程序集中定义的各种类型

Type^ formType = Form.:Typeid;                   //获取Form类型信息

for(int i=0; i< types->Length;i++)

{

if(formType->IsAssignableForm(types[i]))    //判断当前类型实例与Form类型是否匹配

{

    //假设所有类型都具有默认构造器,动态创建当前类型的对象实例

    Form^ f = dynamic_cast<Form^>(Activator::CreateInstance(types[i]));   //动态绑定

    if(f) f->show();

}

}

3)类型创建(到System.Reflection.Emit查看相关类型)

TypeBuilder^ typeBuilder = moduleBuilder->DefineType(“MyType”,//类型名称

                   TypeAttributes::Public|TypeAttributes::Class,

                                         Object::typeid,   //继承的类型

                                         interfaceTypes);  //实现的各个接口(数组)

typeBuilder->AddInterfaceImplementation(IMyInterface::typeid);   //实现接口

……

ILGenerator^ ilGenerator = methodbuilder->GetILGenerator();     //动态产生IL代码

ilGenerator->Emit(OpCodes::Ldarg_1); //为类型添加成员. OpCodesIL指令, Ldarg_1是参数

……

//获取方法的信息

MemberInfo^ methodInfo = typeid< IMyInterface ^>->GetMethod(“MyMethod”);

typeBuilder->DefineMethodOverride(methodbuilder, methodInfo);  //实现方法

2、  特性(Attributes

原理:在编译时将应用的各个特性进行实例化,动态为所关联的类型提供一部分元数据来作为该类型的标记,然后在运行时利用反射来对标记进行查询,进而来使用类型

posted on 2008-09-04 03:32  开(^_^)心  阅读(274)  评论(0编辑  收藏  举报