C# 将 ExpandoObject 转换或转换为特定类对象

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.JsonSerializeObject将数据转换为字符串并将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。但这不是真的,所以你不能这样做