gpt4 book ai didi

monomac - 如何将 NSObject.FromObject 反转回常规 C# 类型

转载 作者:行者123 更新时间:2023-12-04 15:44:58 27 4
gpt4 key购买 nike

NSObject.FromObject 的反面是什么,例如,从 NSObject 中取回一个常规的 C# 对象。可以理解的是,这仅适用于简单类型。

更新。 假设我什至知道类型 - 但在运行时之前不知道。我试过

Convert.ChangeType (value, info.PropertyType, null)

但我收到一条消息“值不是可转换的对象:MonoMac.Foundation.NSString 到 System.String”。

更新 2。 FromObject 的工作原理:

using MonoMac.ObjCRuntime;
using System;
using System.Drawing;
public static NSObject FromObject (object obj)
{
NSObject result;
if (obj == null)
{
result = NSNull.Null;
}
else
{
Type type = obj.GetType ();
if (type == typeof(NSObject) || type.IsSubclassOf (typeof(NSObject)))
{
result = (NSObject)obj;
}
else
{
switch (Type.GetTypeCode (type))
{
case 3:
result = new NSNumber ((bool)obj);
return result;
case 4:
result = new NSNumber ((ushort)((char)obj));
return result;
case 5:
result = new NSNumber ((sbyte)obj);
return result;
case 6:
result = new NSNumber ((byte)obj);
return result;
case 7:
result = new NSNumber ((short)obj);
return result;
case 8:
result = new NSNumber ((ushort)obj);
return result;
case 9:
result = new NSNumber ((int)obj);
return result;
case 10:
result = new NSNumber ((uint)obj);
return result;
case 11:
result = new NSNumber ((long)obj);
return result;
case 12:
result = new NSNumber ((ulong)obj);
return result;
case 13:
result = new NSNumber ((float)obj);
return result;
case 14:
result = new NSNumber ((double)obj);
return result;
case 18:
result = new NSString ((string)obj);
return result;
}
if (type == typeof(IntPtr))
{
result = NSValue.ValueFromPointer ((IntPtr)obj);
}
else
{
if (type == typeof(SizeF))
{
result = NSValue.FromSizeF ((SizeF)obj);
}
else
{
if (type == typeof(RectangleF))
{
result = NSValue.FromRectangleF ((RectangleF)obj);
}
else
{
if (type == typeof(PointF))
{
result = NSValue.FromPointF ((PointF)obj);
}
else
{
INativeObject nativeObject = obj as INativeObject;
if (nativeObject != null)
{
result = Runtime.GetNSObject (nativeObject.Handle);
}
else
{
result = null;
}
}
}
}
}
}
}
return result;
}

最佳答案

就像 FromObject转换,您必须逐案处理。

NSNumber s,使用显式转换(也适用于 bool):

NSNumber number;
double d = (double)number;

NSString s、隐式转换甚至工作:

NSString nsstring;
string converted = nsstring;

但我猜你已经想到了值类型转换。

对于引用类型,源自 NSObject 的所有类型(对于大多数要来回传递给 native 的对象来说都是这种情况)有一个构造函数重载采用 IntPtr作为论据。用那个。

NSObject native;
var label = new UILabel (native.Handle);

话虽如此, NSObject是多余的。您的本地库可能只返回 IntPtr ( void* ) 你可以用来重新创建你的对象。你不必这样做:

IntPtr ptr;
NSObject nsobject = new NSObject (ptr);

关于monomac - 如何将 NSObject.FromObject 反转回常规 C# 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19024276/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com