在C ++中,我有三个相互继承的类和一个工厂。我正在尝试使用SWIG生成C#包装程序,但遇到了一些困难。狗是从动物继承而来的。 DogFactory返回指向真正是狗的动物的指针。 C#无法将由该工厂制造的动物正确地投射到Dog实例。提出了一种解决方案,以使C#强制转换可以在HERE中工作。
//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;
}