SWIG Down Cast in C#

时间:2019-03-11 19:54:12

标签: c# c++ swig downcast

在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;
}

0 个答案:

没有答案