2013-09-26 3 views
5

Что такое обратный NSObject.FromObject, например, получение обычного объекта C# из NSObject. Понятно, что это может работать только для простых типов.Как отменить NSObject.FromObject обратно на обычный тип C#

Обновление. Предположим, что я даже знаю тип, но не до запуска. Я попытался

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

, но я получаю сообщение, что «Значение не является конвертируемым объект: MonoMac.Foundation.NSString в System.String».

Update 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; 
} 

ответ

1

Так же, как FromObject преобразование, вы должны справиться с этим в каждом конкретном случае.

для NSNumber с, использовать явное приведение типов (работает BOOL а):

NSNumber number; 
double d = (double)number; 

для NSString с, неявное преобразование даже работать:

NSString nsstring; 
string converted = nsstring; 

Но я думаю, вы уже поняли значение типы конверсий.

Для ссылочного типа все типы, происходящие от NSObject (в этом случае для большинства объектов, которые вы хотите передать назад и вперед на нативный), есть перегрузка конструктора с использованием аргумента IntPtr. использовать это.

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

Это, как говорится, NSObject является излишним. Ваша родная библиотека могла бы просто вернуть (void*), которую вы могли бы использовать для воссоздания ваших объектов. Вам не нужно это делать:

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