“does not contain a definition…and no extension method..” error

21,543

Your reference to _dataService is of the type IDataService, which means that you can only access members defined by this interface (or extension methods for said interfae). You mention that LoadPortalStatus isn't part of that interface and thus you cannot access it through the _dataService reference.

Updated based on comment: Let's look at another example. If you define a List<int> reference like this:

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

you can access all the members of List<T>() and all the members of Object. However, if you change the reference to

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

the only accessible members through i are GetEnumerator which is defined on IEnumerable<T> and the members inherited from Object.

If you include the System.Linq namespace, you also get access to the numerous extension methods defined for IEnumerable<T>.

The static type of i determines which members are available through that reference.

Share:
21,543
sshirley
Author by

sshirley

Updated on May 09, 2020

Comments

  • sshirley
    sshirley about 4 years

    I am having an issue whereby I cannot use an objects method because of this error:

    Does not contain a definition...and no extension method...

    It is very related to this question. I am doing what is given as the answer in that question, but I am still getting this error.

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

    The error lies at LoadPortalStatus(). LoadChartItems() is fine. NetworkBandwidthLoaded and NetworkPortalStatusLoaded are delegates.

    NetworkPortalStatusLoaded is laid out pretty much the same as 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";
    }
    

    My DataServiceNetworkHealth class is defined as:

    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)
            {
              ....
            }
        }
    }
    

    Method LoadChartItems() is defined in the interface IDataService, but LoadPortalStatus is not. Perhaps that's where the problem lies. There are other DataServiceX classes that do not use LoadPortalStatus.

    I know this is a long post, but I thought better to give all info up front. :-) Thanks for any help!