在使用 C# 接口时让 csinterface_driven 工作

问题描述 投票:0回答:1

我在 C++ 头文件中有以下类继承模式。

class Base{  
public:
  virtual ~Base() = default; 
};
template<class T> class Container : public Base{ 
public:
  ~Container () override = default;
  // The rest of implementations
};

我已将基类导出到 C#,并希望为实现 IEnumerable 的 Container 创建一个 C# 接口。从documentation看来我需要使用csinterfaces_衍生。我无法让它与以下模式一起工作。即使我交换以下两行的顺序,IEnumerable 也会丢失。有什么建议吗?

%typemap(csinterface_derived) Container<int>  “IEnumerable<int>";
%template (ContainerOfInt) Container<int>;
c# swig
1个回答
0
投票

%typemap(csinterface_derived)
有错别字。 应该是
%typemap(csinterface
s
_derived)

此外,即使

Container<T>
模板类碰巧继承自另一个基类,如果注入实际的 C# 自定义代码(通过
%typemap(cscode)
,通过神奇命名的方法
IEnumerable<T>
实现
public System.Collections.Generic.IEnumerator<T> GetEnumerator()
,那么一个不需要显式影响/影响生成的 SWIG C# 类包装器的继承,即不需要显式指示
IEnumerable
IEnumerable<T>
作为继承/实现的 C# 接口。在这种情况下,使用
%typemap(csinterface
s
 )
也应该有效。

但是,如果希望让 SWIG C# 类包装器实现其他常用的 C# 接口(例如

System.IDisposable
),那么必须使用
csinterfaces_derived

不知何故,SWIG 的 Cpp-to-

someOtherSupportedPgmLang
实现部分似乎不如 Java-to_
someOtherSupportedPgmLang
灵活。从某种意义上说,对于源 lang = C++,词法分析器和语法/解析器更加复杂,因此 SWIG 需要明确知道是否希望将更多基类/接口附加到目标 C++ 类的继承链。可能是因为它会产生额外的、更耗时的逻辑,以找出现有的 C++ 基类、它们的定义在哪里、正确的继承顺序等,然后添加新的基类型名称。

© www.soinside.com 2019 - 2024. All rights reserved.