У меня есть два универсальные абстрактные типы: Entity
и Association
.
Скажем, Entity
похож на это:
public class Entity<TId>
{
//...
}
и Association
похож на это:
public class Association<TEntity, TEntity2>
{
//...
}
Как я ограничиваю Ассоциацию, таким образом, они могут иметь какой-либо Объект?
Я могу выполнить его следующим:
public class Association<TEntity, TId, TEntity2, TId2>
where TEntity : Entity<TId>
where TEntity2: Entity<TId2>
{
//...
}
Это становится очень утомительным, поскольку больше типов происходит из Association
, потому что я должен подавить передачу TId и TId2. Существует ли более простой способ сделать это помимо просто удаления ограничения?
Эта проблема обычно решается путем наследования вашего универсального класса ( Entity
в данном случае) от общего неуниверсального класса.
public abstract class EntityBase
{
}
public class Entity<TId> : EntityBase
{
}
Это позволит вам:
public class Association<TEntity, TEntity2>
where TEntity : EntityBase
where TEntity2 : EntityBase
{
}
Редактировать
Если их наследование от общего класса является проблемой, то это также можно легко сделать с помощью интерфейса.
Если типы Id
важны внутри определения Association
, вы можете создать включающий «контекст»:
public static partial class EntityIds<TId1, TId2> {
public class Association<TEntity1, TEntity2>
where TEntity1 : Entity<TId1>
where TEntity2 : Entity<TId2>
{
// ...
}
}
Таким образом , объявление класса Association
по-прежнему доступно для понимания и сохраняет необходимые аргументы типа для своих параметров типа.
Заводской метод может помочь вам в обычном случае:
public static class AssociationFactory {
public static EntityIds<TId1, TId2>.Association<Entity<TId1>, Entity<TId2>> Create<TId1, TId2>(/*params...*/) {
return new EntityIds<TId1, TId2>.Association<Entity<TId1>, Entity<TId2>>(/*params...*/);
}
}
Это выглядит слишком много, и если у вас нет специализации сущностей, вы можете смоделировать связь по-другому:
public class Association<TId1, TId2>
{
// ...
Entity<TId1> Entity1 { get; set; }
Entity<TId2> Entity2 { get; set; }
// ...
}