c# - 转换为 IEnumerable<动态>?

标签 c# .net dynamic extension-methods ienumerable

我写了这个扩展方法:

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

并测试了它:

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

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

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

  • 我怎样才能让它像它?

最佳答案

我认为你对什么有误解dynamic方法。本质上,当您告诉编译器一个对象的类型是 dynamic 时,您“ promise ”该对象在运行时 将支持您调用的任何方法或属性,以换取编译器在编译时 不报错。您还 promise ,如果您违背 promise ,您将承担后果。

当你说一个对象是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!
}

original.AsDynamic()给出一个序列 dynamic对象,编译器不会提示您对 SomeUnsupportedMethod 的调用.如果运行时确实不支持该方法,程序就会崩溃;如果 SomeType 的元素实际上支持该方法,不会有崩溃,并且会调用该方法。

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

关于c# - 转换为 IEnumerable<动态>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14111088/

相关文章:

jquery - 动态设置多个 div 背景图像与第三个父 div 相同

c# - 需要使用 ExecuteQuerySegmentedAsync 进行 Azure 表查询的示例

c# - 获取执行指令数的方法是什么?

.net - 通过 Visual Studio dbproj 脚本查找表填充——最佳实践?

.net - 模拟上的所有调用都必须具有相应的设置

.net - 如何调试动态生成的方法?

c++ - 在 C++ 中全局声明的动态数组的多个定义

c# - 从 HttpResponseMessage 获取内容以使用 c# 动态关键字进行测试

c# - 如何将基类型列表转换为派生类型列表

.net - 我想弹出我自己的对话框(在服务器上保存文件而不询问目标路径位置)而不是 adobe 的另存为对话框