Я обертываю библиотеку C, используя C ++ / CLI, чтобы библиотеку C можно было легко использовать из C # иным способом C #.
Некоторые функции в этой библиотеке предназначены для помещения значения в контейнер. В C нет обобщений, поэтому для каждого типа существует функция CLIB_SetBool (значение BOOL), CLIB_SetInt (значение int), CLIB_SetString (char * string) и т. Д.
Чтобы упростить использование из C #, я создал одну функцию Set, которая принимает System :: Object.
У меня есть два связанных вопроса:
С моим методом, как бы вы использовали оператор switch для типа System :: Object для вызова правильной функции CLIB_Setxxxx. [typeid предназначен только для неуправляемого кода, и я не могу использовать GetType.]
Есть ли лучший способ обернуть эти функции, например, используя Generic? [Я начал использовать специализацию шаблонов, но потом понял, что C # не видит шаблоны.]
Спасибо.
EDIT
Как мне реализовать 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 не выполняется для управляемого кода, и, очевидно, случаи недопустимы. Как исправить?