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不提供联想,需要自己补全。

原文地址:https://www.cnblogs.com/fancyblogs/p/7232949.html