//返回List或者数组,不影响 C++调用
public List<IUserInfo> GetUsers(string likeName)
{
List<IUserInfo> users = new List<NetLib.IUserInfo>();
for (int i = 0; i < 10; i++)
{
IUserInfo userinfo = GetUserByID(i);
userinfo.Name += likeName;
users.Add(userinfo);
}
//return users.ToArray();
return users;
}
public IUserInfo GetUserByID(int userId)
{
IUserInfo userinfo= EntityBuilder.CreateEntity<IUserInfo>();
userinfo.ID = userId;
userinfo.Name = "姓名_" + userId;
userinfo.Birthday = new DateTime(1980, 1, 1);
return userinfo;
}
Func<String, IEnumerable> fun;
using namespace System::Collections;
using namespace System::Collections::Generic;
std::list<CppUserInfo> GetUsers(String^ likeName)
{
//调用.NET方法,得到结果
MethodInfo^ method = dotnetObject->GetType()->GetMethod("GetUsers", BindingFlags::Public | BindingFlags::Instance);
Func<String^, IEnumerable^>^ fun = (Func<String^, IEnumerable^>^)Delegate::CreateDelegate(Func<String^, IEnumerable^>::typeid,
this->dotnetObject, method);
IEnumerable^ result = fun(likeName);
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);
}
return cppResult;
}
std::list<CppUserInfo> cppResult;
#include <list>
cppResult.push_back(user);
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);
}
public bool SaveUsers(IList<IUserInfo> users)
{
UserDb.AddRange(users);
return true;
}
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];
using namespace std;
Type t= typeof(List<>);
Type^ t=List<>::typeid;
Type^ t2= List<IUserInfo>::typeid;
String^ listTypeName = System::String::Format("System.Collections.Generic.List`1[{0}]", interfaceType->FullName);
String^ listTypeName = "System.Collections.Generic.List`1"; Type^ listType = System::Type::GetType(listTypeName);
static Type^ CreateGenericListType(Type^ interfaceType)
{
//直接这样创建泛型List不成功:
// String^ listTypeName = System::String::Format("System.Collections.Generic.List`1[{0}]", interfaceType->FullName);
String^ listTypeName = "System.Collections.Generic.List`1";
Type^ listType = System::Type::GetType(listTypeName);
Type^ generListType = listType->MakeGenericType(interfaceType);
return generListType;
}
static IList^ CreateGenericList(Type^ interfaceType)
{
Type^ generListType = CreateGenericListType(interfaceType);
Object^ listObj = System::Activator::CreateInstance(generListType, nullptr);
IList^ realList = (IList^)listObj;
return realList;
}
IList^ realList = CreateGenericList(interfaceType);
IUserInfo userinfo= EntityBuilder.CreateEntity<IUserInfo>();
Object^ CreateEntityFromInterface(Type^ interfaceType)
{
MethodInfo^ method = this->entityBuilderType->GetMethod("CreateEntity", BindingFlags::Public | BindingFlags::Static);
MethodInfo^ genMethod = method->MakeGenericMethod(interfaceType);
Object^ entity = genMethod->Invoke(nullptr, nullptr);
this->CurrEntity = entity;
return entity;
}
int id=(int)CurrEntity["ID"]; CurrEntity["Name"]="张三"; string name=(string)CurrEntity["Name"];//张三
private:
Type^ entityBuilderType;
MethodInfo^ mset;
Object^ _CurrEntity;
//Action<String^, Object^>^ idxAction;
void SetPropertyValue(Object^ entity, MethodInfo^ propMethod, String^ propName, Object^ value)
{
array<Object^>^ paraArr = gcnew array<Object^>{propName, value};
propMethod->Invoke(entity, paraArr);
}
public:
void set(Object^ value)
{
this->mset = _CurrEntity->GetType()->GetMethod("set_Item", BindingFlags::Public | BindingFlags::Instance);
//this->idxAction= (Action<String^, Object^>^)Delegate::CreateDelegate(Action<String^, Object^>::typeid, _CurrEntity, this->mset);
}
void SetPropertyValue(String^ propName, Object^ value)
{
this->SetPropertyValue(this->CurrEntity, this->mset, propName, value);
//参数类型为 Object的委托,可能没有性能优势,反而更慢。
//this->idxAction(propName, value);
}
void SetPropertyValue(Object^ entity, MethodInfo^ propMethod, String^ propName, Object^ value)
{
array<Object^>^ paraArr = gcnew array<Object^>{propName, value};
propMethod->Invoke(entity, paraArr);
}
//示例1:直接调用.NET强类型的参数方法
//仅仅适用于有一个参数的情况并且要求是泛型类型参数
bool SaveUsers(std::list<CppUserInfo> users)
{
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];
IList^ realList = CreateGenericList(interfaceType);
Object^ userObj = helper->CreateEntityFromInterface(interfaceType);
for each (CppUserInfo user in users)
{
helper->CurrEntity = ((ICloneable^)userObj)->Clone();//使用克隆,避免每次反射
helper->SetPropertyValue("ID", user.ID);
helper->SetPropertyValue("Name", gcnew String(user.Name));
helper->SetPropertyValue("Birthday", Covert2NetDateTime(user.Birthday));
realList->Add(helper->CurrEntity);
}
Object^ result= method->Invoke(dotnetObject, gcnew array<Object^>{ realList});
return (bool)result;
}
bool SaveUsers(IList<IUserInfo> users){ }
Func<List<IUserInfo>,bool> fun;
Func<List<Object>,bool> fun2;
List<IUserInfo> GetUsers(string likeName){ }
Func<string,IEnumerable<IUserInfo>> fun;
Func<string,IEnumerable> fun2;
public bool SaveUsers(IList<IUserInfo> users)
{
UserDb.AddRange(users);
return true;
}
public IUserInfo CreateUserObject()
{
return EntityBuilder.CreateEntity<IUserInfo>();
}
public bool SaveUsers2(IEnumerable<Object> para)
{
var users = from u in para
select u as IUserInfo;
return SaveUsers (users.ToList());
}
MethodInfo^ method = dotnetObject->GetType()->GetMethod("SaveUsers2", BindingFlags::Public | BindingFlags::Instance);
Func<System::Collections::Generic::IEnumerable<Object^>^,bool>^ fun2 =
(Func<System::Collections::Generic::IEnumerable<Object^>^, bool>^)Delegate::CreateDelegate(System::Func<Collections::Generic::IEnumerable<Object^>^, bool>::typeid,
this->dotnetObject, method);
System::Collections::Generic::List<Object^>^ list = gcnew System::Collections::Generic::List<Object^>;
//示例2:调用.NET弱类型的参数方法,以便通过委托方法调用
//构建委托方法比较容易,适用于参数数量多于1个的情况,
bool SaveUsers2(std::list<CppUserInfo> users)
{
MethodInfo^ method = dotnetObject->GetType()->GetMethod("SaveUsers2", BindingFlags::Public | BindingFlags::Instance);
Func<System::Collections::Generic::IEnumerable<Object^>^,bool>^ fun2 =
(Func<System::Collections::Generic::IEnumerable<Object^>^, bool>^)Delegate::CreateDelegate(System::Func<Collections::Generic::IEnumerable<Object^>^, bool>::typeid,
this->dotnetObject, method);
Object^ userObj = CreateUserObject();
System::Collections::Generic::List<Object^>^ list = gcnew System::Collections::Generic::List<Object^>;
for each (CppUserInfo user in users)
{
helper->CurrEntity = ((ICloneable^)userObj)->Clone();//使用克隆,避免每次反射
helper->SetPropertyValue("ID", user.ID);
helper->SetPropertyValue("Name", gcnew String(user.Name));
helper->SetPropertyValue("Birthday", Covert2NetDateTime(user.Birthday));
list->Add(helper->CurrEntity);
}
bool result = fun2(list);
return result;
}
NetLibProxy::UserProxy^ proxy = gcnew NetLibProxy::UserProxy("..\\NetLib\\bin\\Debug\\NetLib.dll");
std::list<CppUserInfo> list = proxy->GetUsers("张");
System::Console::WriteLine("C++ Get List data From .NET function,OK.");
System::Diagnostics::Stopwatch^ sw = gcnew System::Diagnostics::Stopwatch;
sw->Start();
for (int i = 0; i<1000; i++)
proxy->SaveUsers(list);
sw->Stop();
System::Console::WriteLine("1,1000 loop,C++ Post List data To .NET function,OK.use time(ms):{0}",sw->ElapsedMilliseconds);
sw->Restart();
for(int i=0;i<1000;i++)
proxy->SaveUsers2(list);
sw->Stop();
System::Console::WriteLine("2,1000 loop,C++ Post List data To .NET function,OK..use time(ms):{0}", sw->ElapsedMilliseconds);
C++ Get List data From .NET function,OK. 1,1000 loop,C++ Post List data To .NET function,OK.use time(ms):65 2,1000 loop,C++ Post List data To .NET function,OK..use time(ms):48
struct UserStruct
{
public int ID;
public string Name;
public DateTime Birthday;
}
class UserProxy
{
User user;
public UserProxy()
{
user = new User();
}
public List<UserStruct> GetUsers(string likeName)
{
List<UserStruct> result = new List<NetApp.UserStruct>();
var list = user.GetUsers(likeName);
foreach (var item in list)
{
UserStruct us;
us.ID = item.ID;
us.Name = item.Name;
us.Birthday = item.Birthday;
result.Add(us);
}
return result;
}
public bool SaveUsers(IList<UserStruct> users)
{
List<IUserInfo> list = new List<IUserInfo>();
IUserInfo userObj = user.CreateUserObject();
foreach (var item in users)
{
IUserInfo currUser = (IUserInfo)((ICloneable)userObj).Clone();
currUser.ID = item.ID;
currUser.Name = item.Name;
currUser.Birthday = item.Birthday;
list.Add(currUser);
}
bool result = user.SaveUsers(list);
return result;
}
Object CreateUserObject()
{
MethodInfo method = user.GetType().GetMethod("CreateUserObject", BindingFlags.Public | BindingFlags.Instance);
Func<Object> fun = (Func<Object>)Delegate.CreateDelegate(typeof( Func<Object>), user, method);
return fun();
}
//反射+委托
public bool SaveUsers2(IList<UserStruct> users)
{
MethodInfo method = user.GetType().GetMethod("SaveUsers2", BindingFlags.Public | BindingFlags.Instance);
Func<System.Collections.Generic.IEnumerable<Object>, bool> fun2 = (Func<System.Collections.Generic.IEnumerable<Object>, bool>)Delegate.CreateDelegate(typeof( System.Func<System.Collections.Generic.IEnumerable<Object>, bool>),
user, method);
List<IUserInfo> list = new List<IUserInfo>();
object userObj = CreateUserObject();
foreach (var item in users)
{
IUserInfo currUser = (IUserInfo)((ICloneable)userObj).Clone();
currUser.ID = item.ID;
currUser.Name = item.Name;
currUser.Birthday = item.Birthday;
list.Add(currUser);
}
bool result = fun2(list);
return result;
}
}
.Net UserProxy
1,1000 loop,.NET Post List data To .NET function,OK.use time(ms):4 2,1000 loop,.NET Reflection Post List data To .NET function,OK.use time(ms):14
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有