【发布时间】:2011-01-06 14:28:30
【问题描述】:
我正在使用 C++/CLI 包装一个 C 库,以便可以在 C# 中以 C# 的方式轻松使用 C 库。
这个库中的一些函数用于将值放入容器中。 C 中没有泛型,因此每个类型都有一个函数 CLIB_SetBool(BOOL value)、CLIB_SetInt(int value)、CLIB_SetString(char* string) 等等。
为了让 C# 更易于使用,我创建了一个单独的 Set 函数,它采用 System::Object。
我有两个相关的问题:
使用我的方法,您将如何在 System::Object 类型上使用 switch 语句来调用正确的 CLIB_Setxxxx 函数。 [typeid 仅适用于非托管代码,我似乎无法使用 GetType。]
有没有更好的方法来包装这些函数,比如使用泛型? [我开始使用模板特化,但后来意识到 C# 看不到模板。]
谢谢。
编辑
如何实现 void Set(System::Object^ value) ?
我想做这样的事情:
void MyWrapper::Set(System::Object^ value)
{
switch(typeid(value))
{
case System::Int32: CLIB_SetInt(MyMarshal<clib_int>(value)); break;
case System::Double: CLIB_SetInt(MyMarshal<clib_double>(value)); break;
//and so on
}
}
托管代码的 typeid 失败,显然这些案例无效。如何解决?
【问题讨论】:
-
不是简单的重载吗?
-
我同意亚历山大的观点;最安全和最透明的方法是简单地为每个函数调用编写一个包装器作为一组重载。
-
从 C# 我想要放置一个 System::Object (我正在使用 devexpress 容器),所以我的一个重载将是 Set(System::Object^ value),它就是这个函数我不知道如何(语法)实现。 +1 亚历山大 C
-
同意三个。它也快了很多。