std::list<CppUserInfo> cppResult;
为此C++需要包含以下头文件:
#include <list>
要将一个对象添加到列表结尾,像下面这样调用即可:
cppResult.push_back(user);
在上一篇中已经讲述了如何从.NET对象转换给C++本地结构体,所以这个转换代码可以直接拿来用,综合起来,要从.NET集合得到C++的列表对象,像下面这样使用:
std::list<CppUserInfo> cppResult;
for each (Object^ item in result)
{
Func<String^, Object^>^ entityProp = EntityHelper::EntityCallDelegate(item);
CppUserInfo user;
user.ID = (int)entityProp("ID");
user.Name = (String^)entityProp("Name");
user.Birthday = Convert2CppDateTime((DateTime^)entityProp("Birthday"));
cppResult.push_back(user);
}
C++传递集合数据给.NET
前面讲了从.NET反射调用获得一个集合,看起来比较容易,但是从C++反射调用时候传递一个集合就不容易了。注意,这里传递的还是.NET的集合,所以这里需要做3件事情:
1,首先构建一个.NET集合对象;
2,转换C++本机结构数据到.NET集合元素;
3,反射调用.NET方法,传递数据过去。
先看要反射调用的.NET方法定义:
public bool SaveUsers(IList<IUserInfo> users)
{
UserDb.AddRange(users);
return true;
}
方法非常简单,没有什么业务逻辑,接受一个列表接口的数据,然后返回一个布尔值。
在C++端看来,SaveUsers方法的参数对象是一个泛型集合,但是具体是什么对象并不知道,所以需要反射出泛型集合的类型,同时还需要构建这样一个泛型集合对象实例。
在本例中,要得到IUserInfo 这个泛型集合的类型,可以通过下面的代码:
MethodInfo^ method = dotnetObject->GetType()->GetMethod("SaveUsers", BindingFlags::Public | BindingFlags::Instance);
array<ParameterInfo^>^ pars = method->GetParameters();
Type^ paraType= pars[0]->ParameterType;
Type^ interfaceType = paraType->GetGenericArguments()[0];
注意上面的代码中使用了C++/CLI的数组类型 array<Type^>^ ,而不是C++标准库的数组,因此不要引用下面的命名空间:
using namespace std;
否则VS会提示数组定义缺少参数。
创建泛型List实例
我们使用List来做集合对象,在C#中,我们可以通过下面的方式得到List泛型的类型,然后进一步创建泛型对象实例:
Type t= typeof(List<>);
但是,对应的C++/CLI写法却无法通过编译:










