“不包含定义......并且没有扩展方法..”错误

时间:2012-05-08 16:08:43

标签: c# .net compiler-errors

由于此错误,我遇到了无法使用对象方法的问题:

  

不包含定义......并且没有扩展方法......

这与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。

我知道这是一个很长的帖子,但我认为最好先提供所有信息。 :-)感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您对_dataService的引用属于IDataService类型,这意味着您只能访问此接口定义的成员(或所述接口的扩展方法)。您提到LoadPortalStatus不是该接口的一部分,因此您无法通过_dataService引用访问它。

根据评论更新:让我们看另一个例子。如果您定义List<int>引用,请执行以下操作:

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

您可以访问List<T>()的所有成员和Object的所有成员。但是,如果您将引用更改为

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

i中唯一可访问的成员是GetEnumerator IEnumerable<T>Object定义,成员继承自System.Linq

如果包含IEnumerable<T>命名空间,您还可以访问为i定义的众多扩展方法。

静态类型{{1}}确定通过该引用可用的成员。

答案 1 :(得分:0)

如果接口中没有LoadPortalStatus(或该接口上的扩展方法),则无法从接口实例调用它。

由于您定义:

private IDataService _dataService;

这意味着您只能访问_dataService(或作为扩展方法)接口中声明的IDataService内的内容,无论该接口的实现是什么。

所以你的选择是:

1)使_dataService变量成为定义LoadPortalStatus的类型。 2)将LoadPortalStatus添加到IDataService界面。 3)为名为IDataService

LoadPortalStatus创建扩展方法

任何一种都可行,但在我看来,1或2可能更可取。

答案 2 :(得分:0)

请原谅我,如果我是愚蠢的,但看起来你没有LoadPortalStatus()方法。但是你确实有2个LoadChartItems()。

复制粘贴错误?

您是否还可以发布界面代码?

答案 3 :(得分: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)
{
    ....
}