如何在realm-dotnet中存储System.Collections.Generic.Dictionary

时间:2018-03-07 10:51:15

标签: c# uwp realm

我试图在我的uwp项目中集成Realm .NET,我想知道是否有任何方法可以在realm-dotnet base中存储System.Collections.Generic.Dictionary。 我试过这个:

 public class Training : RealmObject
{
    public int Id { get; set; }
    public int Id_document { get; set; }
    public IDictionary<string, string>  Names { get; set;}
} 

但是我收到了这个错误:

错误Fody / RealmWeaver:Training.Name是一个尚未支持的'System.Collections.Generic.IDictionary`2'。

感谢您提前,

2 个答案:

答案 0 :(得分:3)

基本请求

没有办法直接将System.Collections.Generic.Dictionary存储到Realm中 在Realm官方网站上,您可以找到您正在搜索的所有信息,例如,here您可以找到支持的数据类型的完整列表(也是集合)。

为了使用与Dictionary类似的结构保存数据,您可能希望使用继承自RealmObject的自定义类,其中包含两个IList<T>属性,例如: / p>

public class RealmDictionary : RealmObject {
    public IList<T> Keys { get; }
    public IList<T> Values { get; }
}

在您的班级中要存储Dictionary,请使用上述RealmDictionary班级的实例:

...
public RealmDictionary Names { get; set; }
...

更新

(使用NewtonsoftJson
  如果必须将数据序列化为Json字符串,则可以将基类设置为:

...
[JsonIgnore]
public RealmDictionary RealmNames { get; set; }
public Dictionary<string,string> Names {
    get {
        return RealmNames.AsDictionary
    }   
}
...

然后在RealmDictionary类中添加一个属性/方法,用于构造带有值的字典,沿着这些行...

public Dictionary<string,string> AsDictionary {
    get {
        Dictionary<string,string> temp = new Dictionary<>();
        for(int i = 0; i < Keys.Count; i++){
            temp.Add(Keys[i], Values[i]);
        }
        return temp;
    }
}

答案 1 :(得分:0)

这将导致找不到“ T”的错误

public class RealmDictionary : RealmObject 
{
    public IList<T> Keys { get; }
    public IList<T> Values { get; }
}

执行此操作的正确方法是,如果您希望键和值的类型相同,请在类名前面添加<T>

public class RealmDictionary<T> : RealmObject 
{
    public IList<T> Keys { get; }
    public IList<T> Values { get; }
}

如果您希望键的类型与值的类型不同,则它看起来像

public class RealmDictionary<T, K> : RealmObject 
{
        public IList<T> Keys { get; }
        public IList<K> Values { get; }
}

同样对于相同类型的键和值的实现

public RealmDictionary Names { get; set; }

实际上会引发异常。

正确的方法是

public RealmDictionary<"TYPE THAT YOU WANT"> Names { get; set; }

例如。

public RealmDictionary<string> Names { get; set; }

对于不同类型的键和值,实现如下所示

public RealmDictionary<string, object> Names { get; set; }

因此,您的将是 String 类型,而它映射到的 Values 将是< strong> 对象