转换为IEnumerable ?
我写了这个扩展方法:
public static class A { public static IEnumerable AsDynamic(this IEnumerable f) { foreach (var element in f) { yield return (dynamic) element; } } }
并测试了它:
List l = new List(){1,2,3}; Console.WriteLine ( l.AsDynamic().GetType());
但是输出是: typeof (IEnumerable)
我认为你对dynamic
意味着什么有误解。 本质上,当您告诉编译器对象的类型是dynamic
,您“保证” 运行时的对象将支持您调用的任何方法或属性,以换取编译器在编译时不抱怨。 您还承诺,如果您违背承诺,您将面临后果。
当你说对象是dynamic
,编译器不能对类型做出假设,所以它使用object
,知道任何东西都可以存储为object
。 当你创建一个IEnumerable
,它变成IEnumerable
,有一个显着的区别:你可以在它的元素上调用任何方法,编译器不会说一个字:
IEnumerable original = ... foreach (dynamic x in original.AsDynamic()) { // Using your method Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent! }
由于original.AsDynamic()
提供了一系列dynamic
对象,因此编译器不会抱怨您对SomeUnsupportedMethod
的调用。 如果在运行时确实不支持该方法,程序将崩溃; 如果该方法实际上是由SomeType
的元素支持的,则不会发生崩溃,并且将调用该方法。
这一切都是为你做的dynamic
; 静态地,“占位符”将保持object
,而typeof
将告诉你。 但是直到运行时才会检查对象的确切function(其方法和属性)。
根据设计, 运行时绑定的行为与静态绑定的行为尽可能相似 。
所以运行时类型是typeof (IEnumerable
静态类型是typeof (IEnumerable
也
运行时在概念上对待它
typeof(object)==typeof(dynamic)
所以,
动态类型就像对象,除了它允许您以编译时未知的方式使用。
尝试使用Linq Extension方法Cast() 。 但我不确定它是否适用于动态。
因为dynamic
不是一种类型
Console.WriteLine(typeof(dynamic)); // error
dynamic只是在运行时解析实际类型
上述就是C#学习教程:转换为IEnumerable ?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1009980.html