Xamarin.ios Xamarin中的结合多维阵列
我正在尝试绑定一个属性,我知道它是一个(多维)Xamarin.ios Xamarin中的结合多维阵列,xamarin.ios,xamarin,Xamarin.ios,Xamarin,我正在尝试绑定一个属性,我知道它是一个(多维)NSArray持有NSArray对象,而这些对象又持有NSObject的实例。我已将该方法绑定为: [Export ("options")] NSObject[][] Options { get; set; } 当我构建绑定时,在为上述属性生成的类中会出现以下错误 从对NSArray.FromNSObjects的生成调用: (1) Argument `#1` cannot convert 'Foundation.NSObject[][]' expr
NSArray
持有NSArray
对象,而这些对象又持有NSObject
的实例。我已将该方法绑定为:
[Export ("options")]
NSObject[][] Options { get; set; }
当我构建绑定时,在为上述属性生成的类中会出现以下错误
从对NSArray.FromNSObjects
的生成调用:
(1) Argument `#1` cannot convert 'Foundation.NSObject[][]' expression to type 'Foundation.NSObject[]'.
(2) Error CS1502: The best overloaded method match for `Foundation.NSArray.FromNSObjects(params Foundation.NSObject[])' has some invalid arguments (CS1502)
从对NSArray.ArrayFromHandle
的生成调用:
(1)错误CS0311:类型'Foundation.NSObject[]不能用作泛型类型或方法'Foundation.NSArray.ArrayFromHandle(System.IntPtr)'中的类型参数'T'。没有从'Foundation.NSObject[]到'ObjCRuntime.INativeObject'的隐式引用转换(CS0311)
这些错误一直指编译器无法在Foundation.NSObject[][]
和Foundation.NSObject[]
之间进行转换。我不明白为什么这会是一个问题,NSArray
是NSObject
的子类,那么为什么它不能将第二个数组维度视为NSObject
(我知道我有其他选择,比如将选项绑定为
NSObject[]
,或者只是简单地NSObject
,但我更愿意尽可能地确保类型安全。)我认为这个问题的出现是因为来自nsobjects和ArrayFromHandle
的方法无法处理多维数组的转换,但我不完全确定
通过从绑定文件(ApiDefinition.cs)中删除Options
的绑定并在分部类中手动绑定属性,我成功地解决了这个问题
我编写了两种方法来在多维NSArray
和NSObject[][]
之间进行转换
private NSArray NSArraysFromTwoDimentionalArray(NSObject[][] firstDimension) {
NSMutableArray nsFirstDimension = new NSMutableArray ();
foreach (NSObject[] secondDimention in firstDimension) {
NSMutableArray nsSecondDimension = new NSMutableArray ();
foreach (NSObject nsObj in secondDimention) {
nsSecondDimension.Add (nsObj);
}
nsFirstDimension.Add (nsSecondDimension);
}
NSArray toReturn = (NSArray)nsFirstDimension.Copy ();
nsFirstDimension.Dispose ();
return toReturn;
}
private NSObject[][] TwoDimentionalArrayFromArrayOfNSArrays (NSArray[] nsFirstDimension) {
NSObject[][] firstDimension = new NSObject[nsFirstDimension.Length][];
int i = 0;
foreach (NSArray nsSecondDimension in nsFirstDimension) {
NSObject[] secondDimension = NSArray.ArrayFromHandle<NSObject> (nsSecondDimension.Handle);
firstDimension[i] = secondDimension;
i++;
}
return firstDimension;
}
private NSArray nsarraysfromTwoDimensionalArray(NSObject[]firstDimension){
NSMutableArray nsFirstDimension=新的NSMutableArray();
foreach(NSObject[]第一维度中的第二维度){
NSMutableArray nsSecondDimension=新的NSMutableArray();
foreach(第二维度中的NSObject nsObj){
nsSecondDimension.Add(nsObj);
}
nsFirstDimension.Add(nsSecondDimension);
}
NSArray toReturn=(NSArray)nsFirstDimension.Copy();
nsFirstDimension.Dispose();
回归回归;
}
私有NSObject[]TwomensionalArrayFromaryOfnSarray(NSArray[]nsFirstDimension){
NSObject[][]firstDimension=新NSObject[nsFirstDimension.Length]];
int i=0;
foreach(NSArray nsFirstDimension中的nsSecondDimension){
NSObject[]secondDimension=NSArray.ArrayFromHandle(nsSecondDimension.Handle);
第一维度[i]=第二维度;
i++;
}
返回第一维度;
}
然后,我使用上述转换方法来实现绑定
public virtual NSObject[][] Options {
[Export ("options")]
get {
NSArray[] firstDimension;
if (IsDirectBinding) {
firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSend (this.Handle, Selector.GetHandle ("options")));
} else {
firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSendSuper (this.SuperHandle, Selector.GetHandle ("options")));
}
return TwoDimentionalArrayFromArrayOfNSArrays (firstDimension);
}
[Export ("setOptions:")]
set {
if (value == null)
throw new ArgumentNullException ("value");
var multiNSArray = NSArraysFromTwoDimentionalArray (value);
if (IsDirectBinding) {
ApiDefinition.Messaging.void_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
} else {
ApiDefinition.Messaging.void_objc_msgSendSuper_IntPtr (this.SuperHandle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
}
multiNSArray.Dispose ();
}
}
公共虚拟NSObject[]选项{
[出口(“期权”)]
得到{
NSArray[]第一维度;
if(IsDirectBinding){
firstDimension=NSArray.ArrayFromHandle(ApiDefinition.Messaging.IntPtr_objc_msgSend(this.Handle,Selector.GetHandle(“选项”));
}否则{
firstDimension=NSArray.ArrayFromHandle(ApiDefinition.Messaging.IntPtr_objc_msgSendSuper(this.SuperHandle,Selector.GetHandle(“选项”));
}
返回二维数组格式的数组Fnsarray(第一维);
}
[导出(“设置选项:”)]
设置{
如果(值==null)
抛出新的ArgumentNullException(“值”);
var multiNSArray=nsarraysfromTwoDimensionalArray(值);
if(IsDirectBinding){
ApiDefinition.Messaging.void_objc_msgSend_IntPtr(this.Handle,Selector.GetHandle(“setOptions:”),multiNSArray.Handle);
}否则{
ApiDefinition.Messaging.void_objc_msgSendSuper_IntPtr(this.SuperHandle,Selector.GetHandle(“setOptions:”),multiNSArray.Handle);
}
Dispose();
}
}
public virtual NSObject[][] Options {
[Export ("options")]
get {
NSArray[] firstDimension;
if (IsDirectBinding) {
firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSend (this.Handle, Selector.GetHandle ("options")));
} else {
firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSendSuper (this.SuperHandle, Selector.GetHandle ("options")));
}
return TwoDimentionalArrayFromArrayOfNSArrays (firstDimension);
}
[Export ("setOptions:")]
set {
if (value == null)
throw new ArgumentNullException ("value");
var multiNSArray = NSArraysFromTwoDimentionalArray (value);
if (IsDirectBinding) {
ApiDefinition.Messaging.void_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
} else {
ApiDefinition.Messaging.void_objc_msgSendSuper_IntPtr (this.SuperHandle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
}
multiNSArray.Dispose ();
}
}