Сравнение в универсальных классах - C#
Формулировка задачи:
Приветствую всех!
Столкнулся с проблемой при работе с шаблонными классами.
Суть в следующем: есть сущности, реализующие интерфейс IEntity<IdT>, для которых предусматривается обязательное наличие свойства Id типа IdT. По сути Id может быть любого типа (int, string, decimal)
Проблема возникает в классе C, там используется Compare для сравнения двух сущностей. Если в качестве условия к классу С указать и это правильно, т.к. int - структура
Если убрать условие
или указать, что IdT - структура (при этом возникнет при попытке использовать ключ типа string)
то компилятор ругается на строку
Подскажите, как правильно сделать это сравнение?
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; }
}where IdT : class
, то проблемы возникают при объявленииC<B, A,int> c1 = new C<B, A,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;
}
} 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>();