在用dynamic做为一个方法的参数时,在方法内调用基于接口的对象方法,该方法对来源于接口的父接口时一不小心会报该方法未被申明的错误,闲话不多说,直接看源码。
1.首先先建一个接口
public interface ISendBase { void SendDataBase(string data); }
2.再创建一个接口,并继承上述的接口
public interface ISend : ISendBase { void SendData(string data); }
3.创建一个继承接口的实现
public class SendData : ISend { public void SendDataBase(string data) { Console.WriteLine(data); } void ISend.SendData(string data) { Console.WriteLine(data); } }
4.创建一个用于调用实现接口类的方法,且该方法以dynamic类型作为参数
public void Send(dynamic data) { ISend send = new SendData(); send.SendDataBase(data.ToString()); }
注意此种写法调用将会报如下错误
你将会被这头痛,明明在接口的基类内有该方法的申明,并且编译通过无任何语法错误,为何呢?然用如下写法却能成功执行
public void Send(dynamic data) { ISend send = new SendData(); string strData = data.ToString(); send.SendDataBase(strData); }
原因:dynamic类型作为一个动态类型,只有在运行过程中方可知其类型,在采用第一种调用时在执行过程时传入的参数未知类型的,然在接口中并未有dynamic类型的参数方法申明,故而报错,然第二种先通过一个变量来接收dynamic类型参数并将其强制转换了,至此对其明确了类型,然后再将变量传入调用方法中就能找到相应的方法。