2015-02-07 51 views
0

我有一个PersistenceHandler,它实现了不同类型的持久性(至少它会) 但是,我遇到了一些从文件加载的问题。从PersistenceHandler铸造反序列化对象

代码:

static public object Load(string fileName) 
{ 
    return _persistence.Load(fileName); 
} 

使用这种方法从JsonPersistence:

public object Load(string fileName) 
{ 
    string readAllText = File.ReadAllText(fileName);  
    return JsonConvert.DeserializeObject<Dictionary<EnumCategories, CategoryViewModel>>(readAllText);  
} 

这工作得很好。只要我想序列化到指定的类型。 但是,当我想使用它的任何类型的对象,我不能让它的工作。 我已经使用声明类型为对象,而不是尝试,然后在它的“目标”

像这样将它转换:(我是OFC加载包含了JSON

Employees = (List<EmployeeModel>)PersistenceHandler.Load(_fileName); 

我得到一个铸件例外正确的信息)

其他信息:无法转换 类型 'Newtonsoft.Json.Linq.JArray' 到类型 的对象 'System.Collections.Generic.List`1 [KanbanBoard.Model.EmployeeModel]'。

我能得到它的工作的唯一办法是通过铸造它放在我反序列化在我JsonPersistence类,或者使用newtonsoft类它来回转换,在目标点(如上面的例子。

这将是很好 - 除了我试图真的很难让我的程序即可轻松添加功能,以尽可能

我在github上整个项目:https://github.com/Toudahl/KanbanBoard 编辑:我目前在重构工作分支

回答

4

你可以改变你的方法

public T Load<T>(string fileName) 
{ 
    string readAllText = File.ReadAllText(fileName); 
    return JsonConvert.DeserializeObject<T>(readAllText); 
} 

现在,它可以像使用:

Employees = PersistenceHandler.Load<List<EmployeeModel>>(_fileName); 
+0

真棒,这是最完美的解决方案:) 我们havnt学到了很多关于创建通用的东西,但 - 我想我只是可以使用的课程 - 我觉得很愚蠢,因为没有在方法上尝试相同的方法 – 2015-02-07 18:44:08