В C ++ у меня есть три класса, которые наследуются друг от друга, и фабрика. Я пытаюсь использовать SWIG для создания оболочки C # и столкнулся с некоторыми трудностями. Собака наследуется от Зверя. DogFactory возвращает указатель на животное, которое действительно является собакой. C # не может правильно привести животное, сделанное на этой фабрике, в экземпляр Dog. Было предложено решение заставить C # работать в ЗДЕСЬ .
//Zoo.h file
%module Zoo
%{
#include "ZooNative.h"
%}
%include "ZooNative.h"
%pragma(csharp) imclasscode=%{
public static Animal InstantiateConcreteAnimal(System.IntPtr cPtr, bool owner)
{
Animal ret = null;
if (cPtr == System.IntPtr.Zero)
{
return ret;
}
uint[] typeIDs = { 0, 1};
int typeID = -1;
foreach (int id in typeIDs)
{
bool typeMatch = $modulePINVOKE.Animal_IsTypeOf(new System.Runtime.InteropServices.HandleRef(null, cPtr), id) == 1;
if (typeMatch)
{
typeID = id;
break;
}
}
if (typeID != -1)
{
switch(typeID)
{
case 0:
return new Animal(cPtr, owner);
case 1:
return new Dog(cPtr, owner);
}
}
System.Diagnostics.Debug.Assert(false, "Failed to find the type for the pointer");
return ret;
}
%}
%typemap(csout, excode=SWIGEXCODE) Dog*{
IntPtr cPtr = $imcall;
$csclassname ret = ($csclassname) $modulePINVOKE.InstantiateConcreteAnimal(cPtr, $owner);$excode
return ret;
}