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

tof*_*tim 6 monomac xamarin.mac

与NSObject.FromObject相反的是,例如,从NSObject中取回常规C#对象.可以理解,这只适用于简单类型.

更新.假设我甚至知道类型 - 但不是在运行时之前.我试过了

Convert.ChangeType (value, info.PropertyType, null)
Run Code Online (Sandbox Code Playgroud)

但我得到一条消息"值不是一个可转换的对象: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;
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*oix 2

就像转换一样FromObject,您必须根据具体情况进行处理。

对于NSNumbers,使用显式转换(也适用于 bool):

NSNumber number;
double d = (double)number;
Run Code Online (Sandbox Code Playgroud)

对于NSStrings,隐式转换甚至可以工作:

NSString nsstring;
string converted = nsstring;
Run Code Online (Sandbox Code Playgroud)

但我想您已经计算出了值类型转换。

对于引用类型,所有派生类型NSObject(您想要来回传递给本机的大多数对象都是这种情况)都有一个采用 asIntPtr参数的构造函数重载。用那个。

NSObject native;
var label = new UILabel (native.Handle);
Run Code Online (Sandbox Code Playgroud)

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

IntPtr ptr;
NSObject nsobject = new NSObject (ptr);
Run Code Online (Sandbox Code Playgroud)