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

标签 c# objective-c arrays nsarray monomac

我刚刚开始使用 MonoMac 开发一个项目,到目前为止它非常棒。但还有一些事情我不确定。例如:你如何使用数组?这是我发现的:当我从正在调用的方法返回 NSArray 并尝试获取该数组中的自定义对象之一时,我不断收到类似“cannot convert将 System.IntPtr 键入 MyType"。

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

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

int[] intArray = int[10];

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

那么去这里的路是什么?

谢谢
–f

最佳答案

一般来说,使用 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 绑定(bind)工具来访问 Objective-C API,那么您就没有正确地绑定(bind)东西。您的契约(Contract) API 应该具有强类型版本,而不是 NSArray,因此:

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

应该变成:

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

关于c# - 在 MonoMac 中使用数组的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4113513/

相关文章:

javascript - 如何将 $.map 与 Object.keys 函数一起使用来从为 Object.keys 给出的数组中获取第一个值?

java - 修复 2 个应该删除重复和反向顺序对的方法

c# - 如何访问另一个类中的事件处理程序

c# - 使用点击事件访问同一个类中的另一个变量

C# Lucene.Net 拼写检查器

ios - 当以编程方式设置 View Controller 时,UINavigationController 不显示下一步按钮

c++ 数组元素的别名

c# - 使用 EF 实体显示自定义 View

ios - Game Center GKTurnBasedMatch 问题与 matchData 属性

objective-c - 使用什么格式来录制音频?