在MonoMac中使用数组的正确方法

flo*_*hei 6 c# arrays objective-c nsarray monomac

我刚刚开始在MonoMac上开展一个项目,到目前为止这个项目非常酷.但是还有一些我不确定的事情.例如:你如何使用数组?这是我发现的:当我NSArray从一个我正在调用的方法返回时,我尝试获取该数组中的一个自定义对象,我不断得到类似" cannot convert type System.IntPtr to MyType"的东西.

NSArray groupArray = (NSArray)groupDictionary.ObjectForKey(key);
MyType myObject = (MyType)groupArray.ValueAt(0);
Run Code Online (Sandbox Code Playgroud)

这是我回来的数组.但是,如果我想自己创建一个数组怎么办?NSArray的实现不允许我实例化它.所以如果我把MonoMac网站弄好了,我应该使用像这样的普通数组

int[] intArray = int[10];
Run Code Online (Sandbox Code Playgroud)

分别是一个强类型数组,我不知道如何在C#中使用它.

那么去这里的方式是什么?

谢谢
-f

mig*_*aza 11

通常,使用NSArray并不是很有用,因为您最终会遇到上述问题.

这就是为什么通常你应该将NSArray转换为强类型数组.MonoMac低级运行时为您代表的所有回调执行此操作.

通常你会这样做:

YourType [] stronglyTyped = NSArray.ArrayFromHandle<YourType> (arrayIntPtrHandle);
Run Code Online (Sandbox Code Playgroud)

请注意,NSArray只能存储NSObject,因此"YourType"需要是从NSObject派生的对象.

现在,如果您仍想使用NSArray,您需要记住的是ValueAt返回底层对象句柄(IntPtr),要将它与C#一起使用,您需要将其转换为NSObject.使用Runtime.GetNSObject方法执行此操作,可以将结果强制转换为派生类型最多的类型:

YourType x = (YourType) Runtime.GetNSObject (NSArray.ValueAt (0));
Run Code Online (Sandbox Code Playgroud)

话虽这么说,如果你使用API​​绑定工具来访问Objective-C API,你就没有正确绑定东西.您的合同API应该而不是NSArray应该具有强类型版本,因此:

 [Export ("getElements")]
 NSArray GetElements ();
Run Code Online (Sandbox Code Playgroud)

应该成为:

 [Export ("getElements")]
 YourType [] GetElements ();
Run Code Online (Sandbox Code Playgroud)