当前位置: 首页 > 编程语言 > C#

将对象转换为IEnumerable ,其中T未知分享

时间:2023-04-10 19:26:24 C#

C#学习教程:将一个对象转换为IEnumerable,其中T是未知的在下面的代码中,我们假设“obj”可以是IEnumerable或ICollection或IList。我想始终将此System.Object转换为IEnumerable(因为ICollection和IListIEnumerable仍然继承自IEnumerable),因此我想枚举集合并使用反射来编写各个项目。这背后的动机是我只是想看看序列化程序通常如何序列化数据,所以我尝试模拟这种情况并希望也能理解反射。我想将该对象转换为非泛型IEnumerable,但认为当我们说IEnumerable的实际实例时,这会导致不必要的对象装箱……我在想什么?privatevoidWriteGenericCollection(objectobj){TypeinnerType=obj.GetType().GetGenericArguments()[0];//示例:IEnumerable或IEnumerable类型generatedType=typeof(IEnumerable).MakeGenericType(innerType);//我如何枚举单个项目?好吧,因为在运行之前您不知道项目的实际类型,所以您不需要使用通用的IEnumerable接口;只需使用非泛型IEnumerable(泛型继承自它):privatevoidWriteGenericCollection(objectobj){IEnumerableenumerable=(IEnumerable)obj;foreach(objectiteminenumerable){...}}你的问题充满了误解。让我们清理它们。在下面的代码中,我们假设“obj”可以是IEnumerable或ICollection或IList。如果这是真的,并且如果您知道可枚举类型,则编写该方法的更好方法是privatevoidWriteGenericCollection(IEnumerableobj){//...}我想将此System.Object向下转换为IEnumerable总是(因为ICollection和IList继承自IEnumerable),所以我想枚举集合并使用反射来编写单个项目。在谈论接口时,“继承”不是正确的术语;它也可能给你错误的想法。最好将接口视为契约:在考虑实现接口时,您只能决定按照作者的意图实现它,或者根本不实现它。一些接口是其他接口的超集;他们的合同说“除了合同规定的任何其他事情之外,实施者还必须这样做”。但是实现从不在继承中共享,因为接口不共享任何东西。“沮丧”也不是您在该方法中所做的事情的正确术语。向下转型意味着转移到更派生的类;还有一个接口://注意:该方法仍然是通用的!privatevoidWriteGenericCollection(objectobj){varcasted=(IEnumerable)obj;我考虑过向下转换非泛型IEnumerable的对象,但认为这会导致不必要的对象装箱,当我们说IEnumerable的实际实例时...我在想什么?当且仅当对象是IEnumerable时才会发生装箱,其中T是值类型(数字类型、bool、枚举或结构)。如果对象为某个已知的T实现了IEnumerable,那么您可以简单地将其强制转换为该值。如果T未知,则转换为非泛型IEnumerable并可能影响性能(在任何情况下都无法解决)。如果您对对象一无所知,则只需要使用反射(在这种情况下,您当然还需要规划不可枚举的对象,否则为什么首先允许将它们传递给您的方法?)。以上就是C#学习教程:将对象转换为IEnumerable,其中T未知分享所有内容,如果对你有用还需要详细了解C#学习教程,希望大家多多关注吧——本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: