“不包含定义...并且没有扩展方法
本文关键字:扩展 方法 包含 定义 不包含定义 | 更新日期: 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)
{
....
}