转换为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)

  • 为什么它不是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只是在运行时解析实际类型