将对象类型转换为自定义类时出现System.InvalidCastException

时间:2018-04-30 00:48:23

标签: c# casting xamarin.android json.net

今天处理我的代码我遇到了一个阶段,我需要将一个对象类型转换为我的自定义类,这应该非常简单,但我最终解决了System.InvalidCastException几个小时,最后我最终使用{ {1}}完成工作。

我不确定是否有更好的方法来解决这个问题,如果有的话我想知道我能做得更好。

给定的是我的自定义类的结构

JsonConvert

Event类位于DataContract共享项目中,项目的文件夹结构如下所示,

Solution structure

使用EntityFramework我从我的sqlite数据库中获取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 } } 并且我使用此列表在我的tableview中显示android的元素,我在列表中一次查看一个项目并尝试将其转换为我的自定义事件类。

鉴于我试过的代码是

List<Event>

我得到的异常在图像中给出,我无法在这里看到堆栈跟踪,因为它显示为null

enter image description here

当我在控制台中观察//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 } 变量的值时,我看到它向我显示了从数据库返回的内容的确切值,它甚至在类型列中显示了正确的类型但是对于某些当我单步执行代码时,x的值为null。

enter image description here

作为我的最后一招,我最终使用了item课程并做了类似的事情

JsonConvert

JsonConvert工作,我能够解决我的问题,但我更关注的是知道我是否能比使用JsonConvert更好地解决这个问题或者我所做的是正确的。请建议

2 个答案:

答案 0 :(得分:0)

实际上,经过多次阅读和猜测工作,这是你的问题。

您在下面声明的Event课程,例如

List<Event> tableItems ...

&#34;不是&#34;指向与您在此处投射时完全相同的类

(DataContract.Event)item;

这可以通过右键单击两种类型并选择转到定义来确认,它们可能是不同的地方。

最有可能导致

  1. 一个是生成的代理(如果这是来自WCF,或通过网络),一个是具体的类
  2. 另一个可能的原因是,你有相同组件的不同版本。检查您的参考文献
  3. 同时尝试破解代码,并确定这些类型是否确实指向同一个地方。这是问题,你需要以某种方式纠正它。

    另请注意:如果您正在处理代理和具体类,您无法投射它们(即使它们完全相同),您将不得不手动复制属性或使用像automapper这样的东西,或者像您正在进行序列化和反序列化

答案 1 :(得分:0)

经过长时间的研究,我最终使用自己的JSONSerialization方法来处理问题中提到的转换

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();