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

时间:2010-11-06 14:34:15

标签: c# objective-c arrays nsarray monomac

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

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

那是我回来的数组。但是,如果我想自己创建一个数组怎么办? NSArray的实现不允许我实例化它。所以如果我得到MonoMac website权利,我应该使用像这样的普通数组

int[] intArray = int[10];

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

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

感谢
-f

1 个答案:

答案 0 :(得分: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 ();