我正在使用C++/CLI包装一个C库,这样C库就可以轻松地从C#以C#'ish的方式使用。
这个库中的一些函数用于将值放入容器中。C中没有泛型,因此每种类型都存在一个函数CLIB_SetBool(BOOL值)、CLIB_SetInt(int值)、CLIB_SetString(char* string)等等。
为了更容易地从C#中使用,我创建了一个使用System::Object的集合函数。
我有两个相关的问题:
使用我的方法,
谢谢。
编辑
如何实现void (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失败,显然这些情况无效。怎么修?
发布于 2011-01-06 15:29:30
我不能使用开关,因为在C++中,托管代码似乎没有一个完整的类型表示。
下面的工作。
void MyWrapper::Set(System::Object^ value)
{
if (value->GetType() == System::Int32::typeid)
{
CLIB_SetInt(MyMarshal<clib_int>(value));
}
else if ((value->GetType() == System::Double::typeid)
{
CLIB_SetDouble(MyMarshal<clib_double>(value));
}
//etc
}发布于 2011-01-06 14:37:44
您可能比使用按类型键的委托字典更糟糕(抱歉,C#语法,我已经有一段时间没有使用C++/CLI了)。当然,在每个委托中,您对适当的C函数进行实际调用。
public delegate void CLIBDelegate(object);
// handlers for types that will call the appropriate CLIB_XXX function:
public void CLIB_int(object _obj);
public void CLIB_string(object _obj);
// etc...
// Our dictionary:
Dictionary<System.Type, CLIBDelegate> dict = new Dictionary<System.Type, CLIBDelegate>();
dict[typeof(System.Int32)] = CLIB_int;
dict[typeof(System.string] = CLIB_string;
// etc...
// your set function
void Set(Object _object)
{
if(dict.ContainsKey(_object.GetType())
dict[_object.GetType()](_object);
} // eo Set发布于 2011-01-06 14:50:57
以下几个过载如何?
ref class CLIB_Wrapper
{
static void Set(System::Boolean^ value) { CLIB_SetBool(*value); }
static void Set(System::Int32^ value) { CLIB_SetInt(*value); }
static void Set(System::String^ value) { CLIB_SetString(*value); }
static void Set(System::Object^ value)
{
System::Type^ type = value->GetType();
if( type == System::Boolean::typeid )
{
Set((System::Boolean^)value);
}
else if( type == System::Int32::typeid )
{
Set((System::Int32^)value);
}
else if( type == System::String::typeid )
{
Set((System::String^)value);
}
}
};显然,您需要对字符串-> char*转换进行适当的编组,但您了解了这一点。
编辑以包括类型的检测
https://stackoverflow.com/questions/4615954
复制相似问题