簡體   English   中英

如何聲明泛型類型的泛型約束

[英]How to declare a generic constraint that is a generic type

我有兩個通用的抽象類型: EntityAssociation

讓我們說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<TId> )繼承自公共非泛型類來解決。

public abstract class EntityBase
{

}

public class Entity<TId> : EntityBase
{

}

這將允許您:

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

}

編輯

如果讓它們從公共類繼承是一個問題,那么這也可以通過接口輕松完成。

如果Id類型在Association定義中很重要,您可以創建一個封閉的“context”:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM