一、方法中传入的参数为dynamic,则返回的也是dynamic类型

例如:

    public  string Test(string str)
{
return str + "aa";
}
dynamic t = "";
var t1 = Test(t);

t1的类型为

那假如我们再重构Test

    public string Test(dynamic str)
{
return str + "bb";
}

结果会是一样,"11aa",因为在执行的时候t被解析为string类型,会调用第一个方法。

我们重新定义t变量

    dynamic t = ;
var t1 = Test(t);

这个时候结果"11bb",但是返回类型仍然是dynamic,即使我们已经重构了参数为 dynamic的方法,单返回的结果仍然不是string类型,而是dynamic。

二、dynamic类型无法使用本身类型的扩展方法。例如,上面实例返回的结果虽然是dynamic类型,然而在解析的时候会当作string类型来处理,但是,dynamic无法使用string类型的扩展方法。

例如:

        public static bool IsNotNullOrEmpty(this string str)
{
return str == null || str == "";
}
        var t2 = t.IsNotNullOrEmpty();

会引发异常,string未包含IsNotNullOrEmpty()的定义。其实string是包含了IsNotNullOrEmpty() 的方法的,只是该类型为dynamic类型,在解析的时候才是string类型,这样是不能使用扩展的方法的。

那么是否可以为dynamic写一个扩展方法,实现上述功能呢,其实也不行。dynamic类型暂时不支持扩展方法。

当然仅仅只要实现功能可以自定义一个方法。

        public static bool IsNotNullOrEmpty(dynamic dyn)
{
return dyn == null || dyn == "";
}

虽然dynamic无法使用本来类型的扩展方法,但是可以使用自带的方法。

var t2 =t.Replace('', '');

结果如下,同理一,自带方法的返回结果仍然是dynamic类型。如果明确类型的,可以自己强类型转换一下就好了。

总结:

1. 对于没有对结果进行类型转换的方法,如果参数传的dynamic类型,那么结果也是dynamic类型,不管你是否定义了dynamic的返回类型和传入参数。

2. dynamic无法使用本身类型的扩展方法。例如dynamic{string}无法使用string的扩展方法。

3. dynamic可以使用本身类型的自带方法。例如dynamic{string}可以使用string.Repalce()方法,但是vs不提供联想,需要自己补全。

dynamic不能使用扩展方法的更多相关文章

  1. c# 扩展方法 奇思妙用 高级篇 九:OrderBy(string propertyName, bool desc)

    下面是 Queryable 类 中最常用的两个排序的扩展方法: 1 2 public static IOrderedQueryable<TSource> OrderBy<TSourc ...

  2. dynamic动态类型的扩展方法

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

  3. 【开源】OSharp框架解说系列(3):扩展方法

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  4. C#高级功能(四)扩展方法和索引

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.扩展方法被定义为静态方法,但 ...

  5. 写一个针对IQueryable<T>的扩展方法支持动态排序

    所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...

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

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

  7. C# 扩展方法——mysql-dapper(MySqlMapperExtensions)

    其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html 反射比较耗费性能,反射得到属性进行缓存 根据反射得到的属性,进行动态拼接sql语句 ...

  8. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  9. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

随机推荐

  1. AngularJS 1.x系列:Node.js安装及npm常用命令(1)

    1. Node.js安装 1.1 Node.js下载 Node.js官网:https://nodejs.org 当前下载版本(含npm):Latest LTS Version: v6.10.3 (in ...

  2. Tensorflow调试Bug解决办法记录

    1.ascii' codec can't encode characters in position 0-4: ordinal not in range(128) 原因是python2.X默认的编码是 ...

  3. 作业二:分布式版本控制系统Git的安装与使用

    作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 1.下载安装配置用户名和邮箱. (1)下载安装Github配置 ...

  4. codeforces645B

    Mischievous Mess Makers CodeForces - 645B It is a balmy spring afternoon, and Farmer John's n cows a ...

  5. Nginx 请求的11个阶段

    48 1:当请求进入Nginx后先READ REQUEST HEADERS 读取头部 然后再分配由哪个指令操作 2:Identity 寻找匹配哪个Location  3:Apply Rate Limi ...

  6. python之常用模块一(time、random、os、sys)

    摘要:时间模块time .随机模块random .os模块.sys模块 一.时间模块 三种格式 时间戳时间:浮点数 单位为秒 时间戳起始时间: 1970.1.1 0:0:0 英国伦敦时间 1970.1 ...

  7. Spring MVC 使用介绍(八)—— 类型转换

    一.概述 spring类型转换有两种方式: PropertyEditor:可实现String<--->Object 之间相互转换 Converter:可实现任意类型的相互转换 类型转换的过 ...

  8. Virtual Box虚拟机安装Ubuntu16.04以及整理的一些基本操作

    事先声明,参考自:https://www.cnblogs.com/wyt007/p/9856290.html 撰写此文,纯属是为了便利以后换电脑重装. 转载请注明地址:https://www.cnbl ...

  9. zookeeper的单实例和伪集群部署

    原文链接: http://gudaoyufu.com/?p=1395 zookeeper工作方式 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现 ...

  10. Numpy系列(三)- 基本运算操作

    Numpy 中数组上的算术运算符使用元素级别.最后的结果使用新的一个数组来返回. import numpy as np a = np.array( [20,30,40,50] ) b = np.ara ...