由于此错误,我遇到了无法使用对象方法的问题:
不包含定义......并且没有扩展方法......
这与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。
我知道这是一个很长的帖子,但我认为最好先提供所有信息。 :-)感谢您的帮助!
答案 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)
{
....
}