• dynamic不能使用扩展方法


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

    例如:

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

    t1的类型为

     那假如我们再重构Test

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

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

    我们重新定义t变量

        dynamic t = 11;
        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('1', '2');

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

    总结:

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

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

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

  • 相关阅读:
    配置了configuration.xml之后提示找不到映射关系
    alibaba maven地址
    Linux通过FTP上传文件到服务器
    JS模拟PHP的sleep
    PHP设置会话(Session)超时过期时间实现登录时间限制[转]
    JavaScript with JSONPath
    用于解析通过JS的escape函数加密过的数据
    IDC、ICP、ISP区别
    zTree通过指定ID找到节点并选中
    运动轨迹[转]
  • 原文地址:https://www.cnblogs.com/fancyblogs/p/7232949.html
Copyright © 2020-2023  润新知