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

本文关键字:扩展 方法 包含 定义 不包含定义 | 更新日期: 2023-09-27 18:33:27

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

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

它与这个问题非常相关。我正在做该问题中给出的答案,但我仍然收到此错误。

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";
}

我的数据服务网络健康类定义为:

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。

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

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

您对_dataService的引用属于IDataService类型,这意味着您只能访问此接口定义的成员(或所述interfae的扩展方法)。您提到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的静态类型确定哪些成员可通过该引用使用。

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

由于您定义了:

private IDataService _dataService;

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

因此,您的选择是:

1) 使_dataService变量成为已定义LoadPortalStatus的类型。2) 将LoadPortalStatus添加到IDataService界面。3) 为IDataService创建一个名为LoadPortalStatus的扩展方法

在我看来,其中任何一个都有效,尽管 1 或 2 个可能更可取。

这可能过于明显,但是您是否会收到此错误,因为您的代码中实际上没有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)
{
    ....
}