[英]How to declare a generic constraint that is a generic type
我有兩個通用的抽象類型: 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<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.