在用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類型參數並將其強制轉換了,至此對其明確了類型,然后再將變量傳入調用方法中就能找到相應的方法。