如何声明一个泛型约束,它是一个泛型类型。

9
我有两个通用的抽象类型:EntityAssociation
假设 Entity 的样子是这样的:
public class Entity<TId>
{ 
//...
}

"

Association 看起来像这样:

"
public class Association<TEntity, TEntity2>
{
//...
}

如何限制关联(Association)以便它们可以属于任何实体(Entity)?
我可以通过以下方式实现:
public class Association<TEntity, TId, TEntity2, TId2>
     where TEntity : Entity<TId>
     where TEntity2: Entity<TId2>
{
//...
}

这个过程变得非常乏味,因为有更多类型从Association派生出来,因为我必须不断传递TId和TId2。除了删除限制之外,是否有更简单的方法来做到这一点?
2个回答

11

通常可以通过让你的泛型类(在这种情况下是Entity<TId>)继承一个共同的非泛型类来解决此问题。

public abstract class EntityBase
{

}

public class Entity<TId> : EntityBase
{

}

这将使您能够进行以下操作:

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

}

编辑

如果从一个共同的类继承是个问题,那么这也可以很容易地通过接口实现。


是的,我已经得出结论,接口最适合我的需求,只是我需要重新调整我的接口以具有非泛型基础!我希望有一个巧妙的语言技巧,但唉... - moribvndvs
@HackedByChinese:我确定这是可以添加的内容,但考虑到已经存在一种简单且百分百有效的解决方法(而且不会牺牲任何功能),所以很可能我们在短时间内不会看到类似TEntity<?>的东西 ;) - Adam Robinson
糟糕,我在寻找类似答案时遇到了这个问题...鉴于可以调用“typeof(myGenericClass <>)”,我希望可以以类似开放的方式定义约束。很好的答案。 - Remi Despres-Smyth

0

如果在 Association 的定义中,Id 类型很重要,您可以创建一个封闭的“上下文”:

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; }
  // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接