Как объявить универсальное ограничение, которое является универсальным типом

У меня есть два универсальные абстрактные типы: 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. Существует ли более простой способ сделать это помимо просто удаления ограничения?

9
задан mgrbsk 20 April 2010 в 18:19
поделиться

2 ответа

Эта проблема обычно решается путем наследования вашего универсального класса ( Entity в данном случае) от общего неуниверсального класса.

public abstract class EntityBase
{

}

public class Entity<TId> : EntityBase
{

}

Это позволит вам:

public class Association<TEntity, TEntity2>
    where TEntity : EntityBase
    where TEntity2 : EntityBase
{

}

Редактировать

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

11
ответ дан 4 December 2019 в 20:22
поделиться

Если типы 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; }
  // ...
}
0
ответ дан 4 December 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: