2012-05-08 85 views
3

我有一個問題,即我不能使用,因爲這個錯誤的對象的方法:「不包含定義...並沒有擴展方法。」錯誤

Does not contain a definition...and no extension method...

這是非常與此相關的question。我正在做的是作爲這個問題的答案,但我仍然得到這個錯誤。

namespace MyProject.ViewModel 
{ 
    public class NetworkHealthViewModel : ViewModelBase 
    { 
     private IDataService _dataService; 
     public ObservableCollection<NetworkBandwidthModel> NbicNetworkBandwidth 
     public ObservableCollection<NetworkPortalStatusModel> NbicNetworkPortalStatus 

     public NetworkHealthViewModel() 
     { 
      _dataService = new DataServiceNetworkHealth(); 
      NbicNetworkBandwidth  = new ObservableCollection<NetworkBandwidthModel>(); 
      NbicNetworkPortalStatus = new ObservableCollection<NetworkPortalStatusModel>(); 
      _dataService.LoadChartItems(NetworkBandwidthLoaded, NetworkBandwidthLoadedFailed); 
      _dataService.LoadPortalStatus(NetworkPortalStatusLoaded, NetworkPortalStatusLoadedFailed); 
     } 

錯誤在於LoadPortalStatus()。 LoadChartItems()很好。 NetworkBandwidthLoaded和NetworkPortalStatusLoaded是代表。

NetworkPortalStatusLoaded被佈置幾乎是一樣NetworkBandwidthLoaded:

private void NetworkPortalStatusLoaded(IEnumerable<ChartModel> portalStatItems) 
{ 
    NbicNetworkPortalStatus.Clear(); 

    var networkPortalItems = from item in portalStatItems 
          where ((NetworkPortalStatusModel)item).Unit == "Portal" 
          select item; 

    foreach (var item in networkPortalItems) 
    { 
     NbicNetworkPortalStatus.Add((NetworkPortalStatusModel)item); 
    } 

    Message = "Network Portal details loaded"; 
} 

我DataServiceNetworkHealth類定義爲:

namespace MyProject.DataServices 
{ 
    public class DataServiceNetworkHealth : IDataService 
    { 
     private Action<IEnumerable<ChartModel>> _delagateSuccess; 
     private Action<Exception> _delagateFail; 
     private String _portalHtmlResponse; 

     public void LoadChartItems(Action<IEnumerable<ChartModel>> success, Action<Exception> fail) 
     { 
      .... 
     } 

     public void LoadPortalStatus(Action<IEnumerable<ChartModel>> success, Action<Exception> fail) 
     { 
      .... 
     } 
    } 
} 

方法LoadChartItems()在接口IDataService定義,但LoadPortalStatus是不。也許這就是問題所在。還有其他DataServiceX類不使用LoadPortalStatus。

我知道這是一篇很長的文章,但我認爲最好先提供所有信息。 :-) 謝謝你的幫助!

+1

什麼**精確**方法不能找到編譯器?! – abatishchev

+0

我在代碼中看不到'LoadPortalStatus'方法... –

+0

如果DataServiceNetworkHealth類未聲明LoadPortalStatus方法,那麼您無法在該類的實例上調用該方法。簡單。我錯過了什麼? :) –

回答

2

您對_dataService的引用類型爲IDataService,這意味着您只能訪問由此接口定義的成員(或所述接口的擴展方法)。您提到LoadPortalStatus不是該界面的一部分,因此您無法通過_dataService參考訪問它。

根據評論更新:我們來看另一個例子。如果你定義一個List<int>參考這樣的:

List<int> i = new List<int>(); 

您可以訪問的List<T>()所有成員和Object所有成員。但是,如果你改變通過i引用

IEnumerable<int> i = new List<int>(); 

唯一能夠找到的成員是GetEnumerator這是對IEnumerable<T>定義和成員Object繼承。

如果包含System.Linq名稱空間,還可以訪問爲IEnumerable<T>定義的衆多擴展方法。

i的靜態類型確定哪些成員可通過該引用獲得。

+0

這可能看起來像一個愚蠢的問題,但是你是否說我無法在類MyClass(即MyClass:IMyInterface)中定義未在IMyInterface中定義的其他方法?我必須爲此創建額外的派生類嗎? – sshirley

+0

我在說,如果通過特定的接口引用實例,那麼這是定義您有權訪問的實例成員的哪一部分的合約。即爲該接口定義的接口和任何擴展方法是您可以訪問的成員(以及Object的成員)。 –

+0

我用另一個例子更新了我的答案。希望這可以更好地解釋它。 –

0

如果LoadPortalStatus在接口(或該接口的擴展方法)中不可用,則不能從接口的實例調用它。

自定義:

private IDataService _dataService; 

這意味着你只能在_dataService訪問的東西在IDataService(或擴展方法)接口中聲明,不管是什麼接口的實現。

那麼你的選擇是:

1)使_dataService變量已定義LoadPortalStatus一個類型。 2)將LoadPortalStatus添加到IDataService界面。 3)創建IDataService的擴展方法LoadPortalStatus

任何這些都可以,但在我看來,1或2可能更可取。

0

原諒我,如果我是愚蠢的,但它看起來像你沒有LoadPortalStatus()方法。但是,您確實有2個LoadChartItems()。

複製粘貼錯誤?

您還可以發佈界面代碼嗎?

0

這可能過於明顯,但是您是否會得到此錯誤,因爲您的代碼中實際上沒有LoadPortalStatus方法?

你有多個LoadChartItems方法具有相同的簽名 - 這可能是其中一個應該是LoadPortalStatus()方法嗎?

public void LoadChartItems(Action<IEnumerable<ChartModel>> success, Action<Exception> fail) 
{ 
    .... 
} 

//Same signature as above - is this supposed to implement LoadPortalStatus?? 
public void LoadChartItems(Action<IEnumerable<ChartModel>> success, Action<Exception> fail) 
{ 
    .... 
} 
相關問題