Как применить == к типам generi c - типы данных, такие как string или int, в C# - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующие обобщенные c классы:

public class Entity<Key>
{
    public Key ID;
}

public interface IEntity<T>
{
    T ID { get; set; }
}

public class GenericRepo<TEntity,CEntity,Key>
    where TEntity : class, IEntity<Key>
    where CEntity : class, IEntity<Key>
{
    protected readonly DataContext _context;
    protected readonly IMapper _mapper;

    public GenericRepo(DataContext context, IMapper mapper)
    {
        _context = context;
        _mapper = mapper;
    }

    public CEntity GetByID(Key id)
    {
        //here i get operators == cannot be applied to operands of type 'Key' and 'Key'
        TEntity dbEntity = _context.Set<TEntity>().FirstOrDefault(e => e.ID == id);

        if (dbEntity == null)
        {
            return null;
        }

        return _mapper.Map<CEntity>(dbEntity);
    }
}

Я пытаюсь передать универсальный c тип Key в свойство ID. Я получаю operators == cannot be applied to operands of type 'Key' and 'Key', когда использую == для переданного параметра и свойства Set, которое также имеет тип Key, поскольку они имеют одинаковый обобщенный c тип Key, как я могу реализовать равенство на Key на этих классах?

типы, которые мне нужно передать: int или string.

Однако я попытался добавить предложение where к классу where T : Type, ошибка операндов удалена, но теперь я не могу передать ни string, ни int, как в следующем Entity<int> я получаю there is no boxing conversion from int to System.Type.

Я видел некоторые ответы, такие как использование .Equals и реализация IComparer для классов, но в моем случае это тип, и мне нужно ==, чтобы использовать его в LINQ для SQL в ef- core.

Есть ли условие where для добавления в класс, чтобы я мог передать тип своему классу и использовать == или любым другим способом?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

В итоге я использовал простой .Equals()

TDataSet dbEntity = _context.Set<TDataSet>().FirstOrDefault(e => e.ID.Equals(id));
0 голосов
/ 13 апреля 2020

Как применить == к универсальным c типам

Нет. Это слабость, так сказать, системы типов. NET, что генерики не могут обрабатывать операции, так как операции определяются с помощью методов stati c.

Вы в значительной степени ДОЛЖНЫ иметь go через IComparable или аналогичный интерфейс.

...