一种方法是向 SWIG 生成的 StringVector 添加隐式转换,以便它能够将自身转换为string[]
.
我尝试通过 a 执行此操作typemap
,但无法使其工作。但是,可以使用部分类来完成。
它看起来像这样。在 SWIG 中,
%include std_vector.i
%include std_string.i
/* allow partial c# classes */
%typemap(csclassmodifiers) SWIGTYPE "public partial class"
/* generate template around vector<string> */
%template(StringVector) std::vector< std::string >;
然后在 C# 中,创建 StringVector 的部分版本:
public partial class StringVector: IDisposable, System.Collections.IEnumerable
#if !SWIG_DOTNET_1
, System.Collections.Generic.IList<string>
#endif
{
// cast from C# string array
public static implicit operator StringVector(string[] inVal) {
var outVal= new StringVector();
foreach (string element in inVal) {
outVal.Add(element);
}
return outVal;
}
// cast to C# string array
public static implicit operator string[](StringVector inVal) {
var outVal= new string[inVal.Count];
inVal.CopyTo(outVal);
return outVal;
}
}
这允许您编写如下所示的 C# 代码:
string[] foo= mymodule.getFoo();
string[] thenewfoo= { "one", "two", "three" };
mymodule.setFoo(thenewfoo);
它仍然是 C# 方法签名中的 StringVector,但由于客户端编码器可以使用string[]
它并不重要。