2016-03-16 3 views
5

Я пытаюсь интегрировать Branch.io в свой проект Xamarin и наткнулся на это требование, чтобы преобразовать словарь C# в NSDictionary.Xamarin.iOS, convert dictionary to NSDictionary

Пробовал

  • словарь как NSDictionary // Не работает

Пробовал это также

private NSMutableDictionary BranchData (Dictionary<string, object> data) 
     { 
      List<string> keys = data.Keys.ToList(); 
      NSMutableDictionary branchData = new NSMutableDictionary(); 

      foreach (string key in keys) { 
       branchData.Add (new NSString(key), data[key] as NSObject); 
      } 
      return branchData; 
     } 

Не работает.

Любые провода были бы полезны. Благодаря!

UPDATE:

https://stackoverflow.com/a/5664785/344798

ответ

14

Это, как я преобразовал словарь к NSDictionary

var iconattrs = new Dictionary<string, string> 
       { 
        {"ITEMTYPE", "DIVESITE"}, 
        {"LOCATION", diveSite.Location}, 
        {"DESCRIPTION", diveSite.BriefDescription}, 
        {"LINK", diveSite.Link}, 
        {"ID", diveSite.ID.ToString()} 
       }; 

var myResult = NSDictionary.FromObjectsAndKeys(iconattrs.Values.ToArray() 
               ,iconattrs.Keys.ToArray()) 
+0

Привет, как я могу сделать это с обратной стороны? Я имею в виду NSDictionary для словаря

0

Это работает для меня .. может быть оптимизировано или быть конечно гораздо умнее:

private static NSMutableDictionary ConvertToNativeDictionary(Dictionary<string, object> dict) 
{ 
    NSMutableDictionary newDictionary = new NSMutableDictionary(); 

    try 
    { 
     foreach (string k in dict.Keys) 
     { 
      var value = dict[k]; 

      try 
      { 
       if (value is string) 
        newDictionary.Add((NSString)k, new NSString((string)value)); 
       else if (value is int) 
        newDictionary.Add((NSString)k, new NSNumber((int)value)); 
       else if (value is float) 
        newDictionary.Add((NSString)k, new NSNumber((float)value)); 
       else if (value is nfloat) 
        newDictionary.Add((NSString)k, new NSNumber((nfloat)value)); 
       else if (value is double) 
        newDictionary.Add((NSString)k, new NSNumber((double)value)); 
       else if (value is bool) 
        newDictionary.Add((NSString)k, new NSNumber((bool)value)); 
       else if (value is DateTime) 
        newDictionary.Add((NSString)k, ((DateTime)value).DateTimeToNSDate()); 
       else 
        newDictionary.Add((NSString)k, new NSString(value.ToString())); 
      } 
      catch (Exception Ex) 
      { 
       if (value != null) 
        Ex.Data.Add("value", value); 

       Logger.LogException(Ex); 
       continue; 
      } 
     } 
    } 
    catch (Exception Ex) 
    { 
     Logger.LogException(Ex); 
    } 
    return newDictionary; 
} 

И это NSDate Преобразование:

public static class NSDateExtensions 
{ 
    public static DateTime NSDateToDateTime(this NSDate date) 
    { 
     DateTime reference = TimeZone.CurrentTimeZone.ToLocalTime(
      new DateTime(2001, 1, 1, 0, 0, 0)); 
     return reference.AddSeconds(date.SecondsSinceReferenceDate); 
    } 

    public static NSDate DateTimeToNSDate(this DateTime date) 
    { 
     DateTime reference = TimeZone.CurrentTimeZone.ToLocalTime(
      new DateTime(2001, 1, 1, 0, 0, 0)); 
     return NSDate.FromTimeIntervalSinceReferenceDate(
      (date - reference).TotalSeconds); 
    } 

}