对于一个动态类型来说,你可以认为它包含任意成员,它们都能通过编译。但到了运行时,到底是否拥有这些成员,就真相大白了。如

dynamic test = ;
Console.Write(test.Name);

编译器无法在编译时知道test的真正类型,因此会使用其运行时的实际类型,而默认对于它的所有调用都是合法的,不会引发任何编译时错误。但它会抛出一个运行时异常。因为在运行时,test为一个int,它不具备Name属性。

在编译时,编译器会根据会生成一些调用所需的上下文环境,如所有已知的静态类型等。但它无法知道在源代码中究竟引入了哪些命名空间。因此,你无法调用动态类型所代表的实际类型的扩展方法,也无法将动态类型作为参数传入扩展方法。如

dynamic size = ;
var numbers = Enumerable.Range(, );
var error = numbers.Take(size);

但我们有两种方法可以实现这两点,它们看上去可能有点丑陋,但在你需要的时候却会很有用。这两种方法为:

1. 将动态类型强制转换为已知的符合方法签名的静态类型

2. 以静态方法的形式调用

对于将动态类型作为参数传入扩展方法的情况,你可以这样

dynamic size = ;
var numbers = Enumerable.Range(, );
var workaround1 = numbers.Take((int)size);
var workaround2 = Enumerable.Take(numbers, size);

对于调用动态类型的扩展方法,可以这样

int size = ;
dynamic numbers = Enumerable.Range(, );
var workaround1 = ((IEnumerable<int>)numbers).Take(size);
var workaround2 = Enumerable.Take(numbers, size);

dynamic动态类型的扩展方法的更多相关文章

  1. C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数

    一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...

  2. Net 4.0 之 Dynamic 动态类型

    Net 4.0 之 Dynamic 动态类型 本文主要旨在与网友分享.Net4.0的Dynamic 对Duck Type 的支持.     一..net4.0主要新特性 .Net4.0在.Net3.5 ...

  3. C#基本语法 - .Net 4.0 之 Dynamic 动态类型

      一..net4.0主要新特性 .Net4.0在.Net3.5基础上新增的主要特性有:可选参数.命名参数和Dynamic.具体请阅生鱼片的这篇博文.这里我们着重讲解C#4.0的Dynamic特性,对 ...

  4. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  5. [Swift通天遁地]五、高级扩展-(3)日期和时间类型的扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy

    1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...

  7. 《精通C#》自定义类型转化-扩展方法-匿名类型-指针类型(11.3-11.6)

    1.类型转化在C#中有很多,常用的是int类型转string等,这些都有微软给我们定义好的,我们需要的时候直接调用就是了,这是值类型中的转化,有时候我们还会需要类类型(包括结构struct)的转化,还 ...

  8. c# dynamic动态类型和匿名类

    dynamic类型 简单示例 dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写 expando.Id = 1; e ...

  9. Json.net实现方便的Json转C#(dynamic动态类型)对象

    以前需要将一段json字符串转换为C#对象时,一般都是定义一个与之对应的实体类来接收.这样做有一个很大的缺点,就是当字符串特别长,属性特别多,又有嵌套时,手敲这个实体类就非常痛苦. 比如之前做的一个接 ...

随机推荐

  1. Apache 解析.htaccess

    解决.htaccess不解析 输入a2enmod rewrite 修改/etc/apache.conf 此处改为ALL

  2. Ubuntu安装配置protobuf 2.5

    Ubuntu安装配置protobuf 2.5 一.安装配置环境 Linux 1.安装protobuf 下载文件 https://github.com/protocolbuffers/protobuf/ ...

  3. .net core引用错误的Entity Framework而导致不能正常迁移数据的解决办法

    本人刚学.net core,因此在学习过程中会遇上许许多多的坑.每一位初学者最大的问题在于资料的查看不仔细或是没有正确理解里面的内容,导致在后面自己在不知道错误的情况下做了一个小动作.对于完全没有理解 ...

  4. (Python3) 运行结果 = 10,40 的困扰我一顿饭时间的 代码

    a=10 b=30 def kzkzkz(a,b):   #定义一个函数 a=a+b return a b= kzkzkz(a,b) print(a,b)

  5. react native头部标题样式修改

    navigationOptions: ({navigation}) => ({ headerTitle:'评估记录', headerBackTitle:null, headerLeft:null ...

  6. 【FF14】工匠配方爬取

    目标:爬取最终幻想14工匠配方到excel表格.(一个装修仔的尊严) 代码: from bs4 import BeautifulSoup import urllib.request import xl ...

  7. EL表达式 - 日常使用表达式记录

    表达式 说明 ${field} 查找域,page ->request -> session -> application 中的值. ${field == null ? field1: ...

  8. LOJ #6509. 「雅礼集训 2018 Day7」C

    神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...

  9. textarea高度自适应(转载)

    原文地址:https://blog.csdn.net/itzhongzi/article/details/73949712

  10. Redis缓存穿透和缓存雪崩以及解决方案

    Redis缓存穿透和缓存雪崩以及解决方案 Redis缓存穿透和缓存雪崩以及解决方案缓存穿透解决方案布隆过滤缓存空对象比较缓存雪崩解决方案保证缓存层服务高可用性依赖隔离组件为后端限流并降级数据预热缓存并 ...