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)
就像转换一样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)
| 归档时间: |
|
| 查看次数: |
3029 次 |
| 最近记录: |