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); //为类型添加成员. OpCodes是IL指令, Ldarg_1是参数
……
//获取方法的信息
MemberInfo^ methodInfo = typeid< IMyInterface ^>->GetMethod(“MyMethod”);
typeBuilder->DefineMethodOverride(methodbuilder, methodInfo); //实现方法
2、 特性(Attributes)
原理:在编译时将应用的各个特性进行实例化,动态为所关联的类型提供一部分元数据来作为该类型的标记,然后在运行时利用反射来对标记进行查询,进而来使用类型。
我思故我在