Сравнение в универсальных классах - C#

Узнай цену своей работы

Формулировка задачи:

Приветствую всех! Столкнулся с проблемой при работе с шаблонными классами. Суть в следующем: есть сущности, реализующие интерфейс IEntity<IdT>, для которых предусматривается обязательное наличие свойства Id типа IdT. По сути Id может быть любого типа (int, string, decimal)
    class Program
    {
        static void Main()
        {
            C<B, A,int> c1 = new C<B, A,int>();
 
            A a1 = new A() { Id = 1, Name = "sfgsd" };
            B b1 = new B() { Id = 1, Value = 123123 };
 
            bool rez = c1.Compare(b1, a1);
 
            Console.WriteLine(rez);
 
            Console.ReadLine();
        }
    }
 
    interface IEntity<IdT>
    {
        IdT Id { get; set; }
    }
 
    interface IName<IdT> : IEntity<IdT>
    {
        string Name { get; set; }
    }
 
    interface IValue<IdT> : IEntity<IdT>
    {
        decimal Value { get; set; }
    }
    
    class C<ET, NT, IdT>
        where ET : class, IEntity<IdT>
        where NT : class, IName<IdT>
        where IdT : class 
    {
        public bool Compare(ET obj1, NT obj2)
        {
            return obj1.Id == obj2.Id;
        }
    }
 
    class A : IName<int>
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    class B : IValue<int>
    {
        public int Id { get; set; }
        public decimal Value { get; set; }
    }
Проблема возникает в классе C, там используется Compare для сравнения двух сущностей. Если в качестве условия к классу С указать

where IdT : class

, то проблемы возникают при объявлении
C<B, A,int> c1 = new C<B, A,int>();
и это правильно, т.к. int - структура Если убрать условие
    class C<ET, NT, IdT>
        where ET : class, IEntity<IdT>
        where NT : class, IName<IdT>        
    {
        public bool Compare(ET obj1, NT obj2)
        {
            return obj1.Id == obj2.Id;
        }
    }
или указать, что IdT - структура (при этом возникнет при попытке использовать ключ типа string)
    class C<ET, NT, IdT>
        where ET : class, IEntity<IdT>
        where NT : class, IName<IdT>
        where IdT : struct 
    {
        public bool Compare(ET obj1, NT obj2)
        {
            return obj1.Id == obj2.Id;
        }
    }
то компилятор ругается на строку
 return obj1.Id == obj2.Id;
Operator '==' cannot be applied to operands of type 'IdT' and 'IdT'
Подскажите, как правильно сделать это сравнение?

Решение задачи: «Сравнение в универсальных классах»

textual
Листинг программы
C<B, A,int> c1 = new C<B, A,int>();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.75 из 5
Похожие ответы