美文网首页程序员
记一个动态类型问题

记一个动态类型问题

作者: 转交遇见陈绮贞 | 来源:发表于2016-04-23 01:38 被阅读49次

问题情景#

订单页面需要展示不同订单的游客信息,订单信息有一个公共数据实体,而游客有不同的两个不同的数据实体,于是就有了类似下面的代码

    public class Order
    {
        public string SerialId = string.Empty;
        public dynamic Tours = null;
    }
    var order = new Order();
    order.Tours = new List<string>();
    order.Tours.Any();

赋值后在前台将Tours as 成我们想要的游客数据实体列表,然后在判断是否存在数据时 order.Tours.Any()报错:“System.Collections.Generic.List<string>”未包含“Any”的定义

问题分析#

首先我们得到的确实是一个List类型,那么问题就出现在.Any()这个LINQ语句中,原因是“动态对象不支持扩展方法。lambda也不能用作动态方法调用的参数,因此LINQ不能用于动态对象。大多数LINQ调用都是扩展方法。”-C#高级编程
这是why,那么why why?

    public class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>();
            //dynamic list = new List<string>();
            list.Any();
        }
    }
Paste_Image.png Paste_Image.png
看上面的代码和截图,代码编译成IL后执行过程就已经明确下来,执行需要信息完备了。但是dynamic类型编译成的IL却并没有明确这些执行信息,而是在执行IL时去查找操作的类型,生成表达式树来绑定需要的操作。具体实现本人也还在研究中。

重要的事情来了,dynamic类型生成的IL是动态去查找类型绑定方法,然而扩展方法并不是定义在目标类型中,而只是外部的一个扩展。这时候我们自然就无法找到需要调用的方法,也就会抛出出现开头的报错信息。

解决方案#

  1. 如果目标类型确定的话,将dynamic类型强制转换成需要的类型赋值给一个中间变量,然后操作中间变量。
  2. 试着使用List<dynamic>来接收数据

扩展延伸#

  1. 从上面的示例我们可以知道dynamic类型生成的IL远比一般代码要多得多,所以对性能的影响肯定是有的,建议非特殊情况下能不用dynamic类型就不用。就比如本人上面的代码。
  2. 对于IL等一些比较底层的东西,也许日常工作中不需要了解,但是能了解一些绝对是有帮助的。

相关文章

  • 记一个动态类型问题

    问题情景# 订单页面需要展示不同订单的游客信息,订单信息有一个公共数据实体,而游客有不同的两个不同的数据实体,于是...

  • 函数详解

    首先补充两个概念:一个是动态类型与静态类型,另一个是变量作用域的问题。动态类型和静态类型:动态类型是先声明变量但是...

  • Flow基本语法及使用

    js编程存在的问题 js弱类型的动态类型检查语言弱类型: 被声明时可以赋值为任何数据动态类型: 类型检查会在运行时...

  • 2022-02-19 动态规划高频题专题【1】

    动态规划基本类型 dp基础 背包问题 打家劫舍 股票问题 子序列问题 进阶动态规划 深入理解动态规划过程 定义dp...

  • TypeScript语言

    内容概要 :### 强类型和弱类型 静态类型与动态类型 javaScript 自由类型系统的问题 Flow 静态类...

  • 这几个小技巧,带你玩转探记相册 | 探记使用手册

    相册 1.关于探记的相册 “动态相册”和“普通相册”两种类型。 动态相册默认展示在所有相册的第一个,其余都是用户自...

  • iOS的动态性

    1、iOS的动态性来自三个方面:动态类型、动态绑定、动态载入、SEL类型 1、动态类型<弱类型>(id):在代码的...

  • iOS 的动态性

    原文:iOS面试题大全 iOS 的动态性来自三个方面:动态类型、动态绑定、动态载入、SEL类型①、动态类型<弱类型...

  • Objective-C的动态性、多态性、重载

    1.动态性: OC的动态性具体是指利用id类型(动态类型)的指针指向任意一个对象,此时对象的类型在编译期不做类型检...

  • Java中的绑定

    静态类型和动态类型 任何一个引用变量都有两个类型:一个叫静态类型,也就是定义该引用变量的类型;另一个叫动态类型,也...

网友评论

    本文标题:记一个动态类型问题

    本文链接:https://www.haomeiwen.com/subject/fxbxrttx.html