1つのアプローチは、SWIGで生成されたStringVectorに暗黙のキャストを追加して、から/に自分自身をキャストできるようにすることstring[]
です。
を介してこれを実行しようとしました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[]
実際には重要ではありません。