6

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

NSArray groupArray = (NSArray)groupDictionary.ObjectForKey(key);
MyType myObject = (MyType)groupArray.ValueAt(0);

那是我回来的数组。但是如果我想自己创建一个数组呢?NSArray 的实现不允许我实例化它。因此,如果我的MonoMac 网站正确,我应该使用这样的普通数组

int[] intArray = int[10];

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

那么去这里的路是什么?

谢谢
-f

4

1 回答 1

11

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

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

通常你会这样做:

YourType [] stronglyTyped = NSArray.ArrayFromHandle<YourType> (arrayIntPtrHandle);

注意 NSArray 只能存储 NSObject,所以“YourType”需要是从 NSObject 派生的对象。

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

YourType x = (YourType) Runtime.GetNSObject (NSArray.ValueAt (0));

话虽如此,如果您使用 API 绑定工具来访问 Objective-C API,那么您并没有正确绑定事物。你的合约 API 应该有强类型版本,而不是 NSArray,所以:

 [Export ("getElements")]
 NSArray GetElements ();

应该变成:

 [Export ("getElements")]
 YourType [] GetElements ();
于 2010-11-06T16:26:22.337 回答