Как использовать интерфейс с универсальным объектом? - PullRequest
0 голосов
/ 13 ноября 2018

У меня проблемы с использованием интерфейса, который я создаю.Я пытаюсь реализовать это, но там происходит ошибка.Любой ответ приветствуется.Заранее спасибо.

Здесь фактический интерфейс, который я хочу реализовать.

namespace CRDM.Core.Models
{
  [Table("cities")]
  public class City : ICity<CountryState>
  {
  }

  [Table("country_states")]
  public class CountryState : ICountryState<Country>
  {        
  }

  [Table("countries")]
  public class Country : ICountry
  {       
  }
}

namespace CRDM.Core.Abstractions.Entities
{
 public interface ICity <TState> :
    where TState : ICountryState<ICountry>
 {
    TState StateReference { get; set; }
 }

 public interface ICountryState<TCountry> :
    where TCountry : ICountry
 {

 }

 public interface ICountry
 {
 }
}

Я успешно реализую классы Country и CountryState, но в реализации City есть ошибка.Здесь сообщение об ошибке.

Тип CRDM.Core.Models.CountryState нельзя использовать в качестве параметра типа TState в универсальном типе или методе ICity<TState>.

Не существует неявного преобразования ссылок из CRDM.Core.Models.CountryState в CRDM.Core.Abstractions.Entities.ICountryState<CRDM.Core.Abstractions.Entities.ICountry>.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Вам, вероятно, нужно спросить себя, чего вы пытаетесь достичь, и вы просто делаете это сложнее, чем нужно.Если вы хотите получить доступ к этим объектам с помощью интерфейсов, но заставить их работать с платформой объектов, я бы сделал ...

namespace CRDM.Core.Models
{
    using CRDM.Core.Abstractions.Entities;

    [Table("cities")]
    public class City : ICity
    {
        public CountryState StateReference { get; set; }
        ICountryState ICity.StateReference
        {
            get
            {
                return StateReference;
            }
            set
            {
                StateReference = (CountryState)value;
            }
        }
    }

    [Table("country_states")]
    public class CountryState : ICountryState
    {
        public Country Country { get; set; }
        ICountry ICountryState.Country
        {
            get
            {
                return Country;
            }
            set
            {
                Country = (Country)value;
            }
        }
    }

    [Table("countries")]
    public class Country : ICountry
    {
    }
}

namespace CRDM.Core.Abstractions.Entities
{
    public interface ICity
    {
        ICountryState StateReference { get; set; }
    }

    public interface ICountryState
    {
        ICountry Country { get; set; }
    }

    public interface ICountry
    {
    }
}
0 голосов
/ 13 ноября 2018

Попробуйте сделать это так:

namespace CRDM.Core.Models
{

    public class City : ICity<CountryState,Country>
    {
        public CountryState StateReference { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
    }


    public class CountryState : ICountryState<Country>
    {
    }


    public class Country : ICountry
    {
    }
}

namespace CRDM.Core.Abstractions.Entities
{
    public interface ICity<TState,TCountry>        
       where TCountry: ICountry
       where TState : ICountryState<TCountry>
    {
        TState StateReference { get; set; }
    }

    public interface ICountryState<TCountry>        
       where TCountry : ICountry
    {

    }

    public interface ICountry
    {
    }
}

Или вот так:

    namespace CRDM.Core.Models
    {
        public class City : ICity<CountryState>
        {
            public CountryState StateReference { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
        }

        public class CountryState : ICountryState<ICountry>
        {
        }

        public class Country : ICountry
        {
        }
    }

    namespace CRDM.Core.Abstractions.Entities
    {
        public interface ICity<TState> 

           where TState : ICountryState<ICountry>
        {
            TState StateReference { get; set; }
        }

        public interface ICountryState<TCountry> 

           where TCountry : ICountry
        {

        }

        public interface ICountry
        {
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...