Unity下C#无法隐式转换List<ExpandoObject>为IDictionary的解决方法
解决Unity中ExpandoObject转IDictionary的问题及其他可选转换类型
错误原因
你的代码报错是因为GetDataFromSheet(gsp)返回的是List<ExpandoObject>集合,而你试图直接赋值给单个IDictionary<string, object>变量——两者是集合类型与单个字典类型的不匹配,并非ExpandoObject本身无法转成IDictionary的问题。
正确的显式转换方式
ExpandoObject本身就实现了IDictionary<string, object>接口,单个ExpandoObject可直接转换,核心是先处理返回的List集合:
场景1:表格只有一行数据(取第一个元素)
// 先接收返回的List集合 List<ExpandoObject> expandoList = gsh.GetDataFromSheet(gsp); // 判空后取第一个元素转成IDictionary if (expandoList != null && expandoList.Count > 0) { // 方式1:as关键字安全转换(转换失败返回null) IDictionary<string, object> sheetData = expandoList[0] as IDictionary<string, object>; // 方式2:强制转换(转换失败会抛出异常,适合确定非空的场景) // IDictionary<string, object> sheetData = (IDictionary<string, object>)expandoList[0]; }
场景2:表格有多行数据(转成字典集合)
如果需要处理所有行,把整个List转成List<IDictionary<string, object>>:
using System.Linq; // 需要引入Linq命名空间 List<IDictionary<string, object>> sheetDataList = gsh.GetDataFromSheet(gsp) .Cast<IDictionary<string, object>>() .ToList();
其他可转换的类型
除了IDictionary,ExpandoObject还可以转换成以下类型适配不同需求:
dynamic类型:直接用dynamic接收,无需显式转换即可直接访问属性,但注意Unity中动态类型会有一定性能开销,不适合高频访问场景:
dynamic leaderboardEntry = expandoList[0]; int playerScore = leaderboardEntry.Score; // 直接通过属性名访问自定义强类型实体类:如果知道排行榜数据的固定结构,可以定义对应的实体类,通过序列化/反射将ExpandoObject映射到实体类上(推荐用Newtonsoft.Json,可在Unity Package Manager导入):
// 定义排行榜实体类 public class LeaderboardEntry { public string PlayerName { get; set; } public int Score { get; set; } public int Rank { get; set; } } // 转换示例 using Newtonsoft.Json; var entryJson = JsonConvert.SerializeObject(expandoList[0]); LeaderboardEntry entry = JsonConvert.DeserializeObject<LeaderboardEntry>(entryJson);Dictionary<string, object>:和IDictionary功能一致,转成具体的字典实现类,用法无差别:
Dictionary<string, object> entryDict = (Dictionary<string, object>)expandoList[0];
内容的提问来源于stack exchange,提问作者decentish
相关产品推荐
相关产品推荐

