【发布时间】:2018-06-05 02:40:29
【问题描述】:
今天在处理我的代码时遇到了一个阶段,我需要将对象类型转换为我的自定义类,这应该非常简单,但我最终解决了几个小时 System.InvalidCastException,最后我最终使用了 JsonConvert完成工作。
我不确定是否有更好的方法来处理这个问题,如果有的话,我想知道我可以做得更好。
Given 是我的自定义类的结构
using SQLite.Net.Attributes;
namespace DataContract
{
public class Event
{
#region Properties
[PrimaryKey]
public int Id { get; set; }
public string Name { get; set; }
public DateTime EventDateTime { get; set; }
#endregion
}
}
Event 类位于 DataContract 共享项目中,我的项目文件夹结构如下所示,
使用 EntityFramework 我从我的 sqlite 数据库中获得了一个 List<Event>,我正在使用这个列表在我的 android 的 tableview 中显示元素,我在我的列表中一次浏览一个项目并尝试将它转换为我的自定义事件类。
给出的是我尝试过的相同代码
//tableItems is my IList<object>
var item = tableItems[position];
var view = convertView;
if (view == null)
{
view = context.LayoutInflater.Inflate(Resource.Layout.NativeAndroidEventCell, null);
}
if (item.GetType().FullName.Equals("DataContract.Event"))
{
var x = item as DataContract.Event; // returns null
var y = (DataContract.Event)item; // cast exception
var z = item.GetType().GetField("Name"); // returns null
}
图像中给出了我得到的异常,我无法在此处看到堆栈跟踪,因为它显示为空
当我在控制台中查看 item 变量的值时,我看到它向我显示了从数据库返回的确切值,甚至在类型列中显示了正确的类型,但由于某种原因,当我单步执行代码,x 的值为空。
作为我最后的手段,我最终使用了JsonConvert 类并做了类似的事情
if (item.GetType().FullName.Equals("DataContract.Event"))
{
//Not sure if this is the right approach here but it works
var serializedObject = JsonConvert.SerializeObject(item, Formatting.Indented);
var deserializedObject = JsonConvert.DeserializeObject<DataContract.Event>(x);
view.FindViewById<TextView>(Resource.Id.textView1).Text = deserializedObject.Name;
view.FindViewById<TextView>(Resource.Id.textView2).Text = deserializedObject.EventDateTime.ToString();
}
JsonConvert 工作,我能够解决我的问题,但我更关注的是知道我是否可以比使用 JsonConvert 更好地解决这个问题,或者我所做的是否正确。请推荐
【问题讨论】:
-
item不是已经属于DataContract.Event类型了吗? -
听起来您可能已经在多个程序集中定义了事件,甚至可能在不同上下文中加载的同一个程序集中定义了事件。 tableItems 究竟是如何填充的?
-
@mikez 说了什么,它抱怨的确切完整名称是什么
-
@JamesT 不,它不是,如代码中所述,它从 List
类型的 tableItems 中获取其值 -
@mikez 用我的文件夹结构更新了我的问题,你认为这是问题所在吗? tableItems 也是一个 IList
标签: c# casting xamarin.android json.net