Phu*_*kem 5 c# casting class typeconverter
我在将 ExpandoObject 转换或转换为 C# 项目中特定类的对象时遇到问题。
对象类别:
public class PlayerData {
public string Id {get; set;}
public string Phone { get; set; }
public Money Money { get; set; }
}
public class Money {
public int Cash { get; set; }
public int Bank { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当服务器向客户端发送一些数据(PlayerData 类型)时,客户端会在 ExpandoObject 类中看到该数据。我也可以使用这些数据(如 Data.Id、Data.Phone 等)。
在我的问题中,我需要将我得到的 ExpandoObject(之前有 PlayerData 类型)转换或转换为客户端的 PlayerData。
投射类型的行:
PlayerData MyData = (PlayerData)Data;
Run Code Online (Sandbox Code Playgroud)
它返回错误:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
Run Code Online (Sandbox Code Playgroud)
我该如何修复它并正确投射或转换它?
注意
// 当我打印Data.GetType()它时返回System.Dynamic.ExpandoObject
Bùi*_*ánh 22
你不能像这样简单地转换类型。处理它的最佳方法是使用Newtonsoft.Json库SerializeObject将数据转换为字符串并将DeserializeObject字符串转换为您的类型
尝试这个
PlayerData player = JsonConvert.DeserializeObject<PlayerData>( JsonConvert.SerializeObject(item));
Run Code Online (Sandbox Code Playgroud)
更新:对于评论中关于为什么不能像这样投射对象的问题
您应该参考https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types/casting-and-type-conversions来了解 C#Cast的工作原理
简而言之,如果你写
PlayerData MyData = (PlayerData)Data;
Run Code Online (Sandbox Code Playgroud)
它仅适用于PlayerData是 的子类Data.GetType(),这里是System.Dynamic.ExpandoObject。但这不是真的,所以你不能这样做