转换为IEnumerable <dynamic>?

Roy*_*mir 10 .net c# ienumerable extension-methods dynamic

我写了这个扩展方法:

public static class A
{
 public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> f)
    {
        foreach (var element in f)
        {
                yield return (dynamic) element;
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

并测试了它:

List<int> l   = new List<int>(){1,2,3};
Console.WriteLine ( l.AsDynamic().GetType());
Run Code Online (Sandbox Code Playgroud)

但输出是: typeof (IEnumerable<Object>)

  • 为什么不typeof (IEnumerable<dynamic>) 呢?

  • 我怎么能让它像它一样?

das*_*ght 23

我认为你对什么dynamic意思有误解.本质上,当您告诉编译器对象的类型是什么时dynamic,您"保证" 运行时的对象将支持您调用的任何方法或属性,以换取编译器在编译时不抱怨.您还承诺,如果您违背承诺,您将面临后果.

当你说一个对象是dynamic,编译器不能对类型做出假设,所以它使用object,知道任何东西都可以存储为object.当你创建一个时IEnumerable<dynamic>,它会变成IEnumerable<object>一个显着的区别:你可以在它的元素上调用任何方法,编译器就不会说一个字:

IEnumerable<SomeType> original = ...
foreach (dynamic x in original.AsDynamic()) { // Using your method
    Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent!
}
Run Code Online (Sandbox Code Playgroud)

由于original.AsDynamic()给出了一系列dynamic对象,编译器不会抱怨你的调用SomeUnsupportedMethod.如果在运行时确实不支持该方法,程序将崩溃; 如果该方法实际上由元素支持SomeType,则不会发生崩溃,并且将调用该方法.

这就是dynamic为你做的一切; 静态地,"占位符"将保留object,typeof并将告诉你.但是直到运行时才会检查对象的确切功能(其方法和属性).