You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过反射遍历泛型List的属性?类型转换报错求助

解决List<具体类型>无法强制转换为List的问题

问题原因

C# 中的List<T>是不变泛型类型,即便RoomCategory继承自object,也不能直接将List<RoomCategory>强制转换为List<object>。不过IEnumerable<T>支持协变,可以借助它间接处理集合元素。另外原代码存在一处逻辑错误:elementProperty.GetValue(packet)是获取packet的属性值,而非集合中每个元素的属性值,需要修正。

修正方案一:利用IEnumerable协变特性
public class NetworkPacketSerializer
{
    public static void WriteArbitraryListPropertyToWriter(PropertyInfo propertyInfo, NetworkPacketWriter writer, object packet)
    {
        // 借助协变转为IEnumerable<object>,避免直接转换List<T>报错
        var collection = (IEnumerable<object>)propertyInfo.GetValue(packet)!;
        var elementList = collection.ToList();
        
        writer.WriteInteger(elementList.Count);

        var properties = elementList
            .SelectMany(element => element.GetType().GetProperties());
        
        foreach (var elementProperty in properties)
        {
            // 获取当前元素的属性值,修正原代码的逻辑错误
            var propertyValue = elementProperty.GetValue(elementProperty.DeclaringType);
            // TODO: 处理属性值
        }
    }
}

修正方案二:使用非泛型ICollection接口

public class NetworkPacketSerializer
{
    public static void WriteArbitraryListPropertyToWriter(PropertyInfo propertyInfo, NetworkPacketWriter writer, object packet)
    {
        // 转为非泛型ICollection,直接获取集合数量
        var collection = (ICollection)propertyInfo.GetValue(packet)!;
        writer.WriteInteger(collection.Count);

        var properties = collection.Cast<object>()
            .SelectMany(element => element.GetType().GetProperties());
        
        foreach (var elementProperty in properties)
        {
            var propertyValue = elementProperty.GetValue(elementProperty.DeclaringType);
            // TODO: 处理属性值
        }
    }
}

内容的提问来源于stack exchange,提问作者user24419920

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:39:52