一、方法中传入的参数为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. nodejs开发辅助工具nodemon

    前面的话 修改代码后,需要重新启动 Express 应用,所做的修改才能生效.若之后的每次代码修改都要重复这样的操作,势必会影响开发效率,本文将详细介绍Nodemon,它会监测项目中的所有文件,一旦发 ...

  2. springdata 动态查询 是用来查询的 仅提供查询功能

    springdata 动态查询 是用来查询的 仅提供查询功能

  3. java垃圾回收GC

    垃圾回收时,暂停虚拟机运行 基础假设:大部分对象只存在很短的时间 对于新生代,Minor GC经常会发生 Major/Full GC会对老生代做GC 老生代GC采用Compact算法,移动形成完整的空 ...

  4. 下载图片没有关闭http输入流导致下载超时

    在某次接入第三方厂商数据时,需要根据对方提供的URL地址下载图片,当数据量大时会遇到很多的下载图片超时问题,开始以为是第三方厂商的问题,对方排查了很久之后,说是我这边下载数据全部留在缓存区,导致缓存区 ...

  5. PHP7 学习笔记(十七)变量函数 - unset

    https://secure.php.net/manual/zh/function.unset.php unset()函数用来清除.销毁变量,不用的变量,可以用unset()将它销毁. 1.unset ...

  6. 使用kqueue的str_cli函数

    void str_cli(FILE *fp, int sockfd) { , isfile; char buf[MAXLINE]; ]; struct timespec ts; struct stat ...

  7. Javaweb学习笔记——(二十四)——————图书商城项目

    图书商城          环境搭建         1.导入原型             *用户模块             *分类模块             *图书模块              ...

  8. rem自适应js

    Rem自适应js---flexible.min.js   网上看到很多移动端适配的各种方法,由于原来工作中对rem的疏忽,所以决定重新学习rem~ 由于移动端特殊性,本文讲的是如何使用rem实现自适应 ...

  9. java获取上个星期第一天和最后一天

    package com.goldcn.jzgmanageplat.b2b.controller; import java.text.SimpleDateFormat;import java.util. ...

  10. 🍓vue & react 一些重要但没必要死记硬背的东西