2012-05-08 65 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) 
{ 
    .... 
} 
相关问题