2010-04-20 6 views
9

Ich habe eine zwei generische abstrakte Typen: Entity und Association.Wie eine generische Constraint, die eine generische Art ist zu deklarieren

Sagen wir Entity wie folgt aussieht:

public class Entity<TId> 
{ 
//... 
} 

und Association wie folgt aussieht:

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

Wie kann ich Vereinigung beschränken, so dass sie jeder Entity sein kann?

Ich kann es durch die folgenden erreichen:

public class Association<TEntity, TId, TEntity2, TId2> 
    where TEntity : Entity<TId> 
    where TEntity2: Entity<TId2> 
{ 
//... 
} 

Diese sehr langweilig wird, da mehr Arten von Association ableiten, weil ich durch den über TId und TID2 zu halten habe. Gibt es einen einfacheren Weg dies zu tun, außer nur die Beschränkung zu entfernen?

Antwort

11

Dieses Problem wird normalerweise gelöst, indem Ihre generische Klasse (Entity<TId>, in diesem Fall) von einer allgemeinen nicht generischen Klasse erbt.

public abstract class EntityBase 
{ 

} 

public class Entity<TId> : EntityBase 
{ 

} 

Dies wird Ihnen erlauben:

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

} 

bearbeiten

Wenn sie von einer gemeinsamen Klasse erben, die ein Problem ist, dann könnte dies leicht mit einer Schnittstelle erfolgen, wie Gut.

+0

Sehr schön !! +1. – Nayan

+0

Ja, ich bin bereits zu dem Schluss gekommen, dass eine Schnittstelle am besten zu meinen Bedürfnissen passt, außer dass ich meine Schnittstellen anpassen muss, um eine nicht-generische Basis zu haben! Ich hatte gehofft, dass es einen ordentlichen Sprachtrick geben würde, aber leider ... – HackedByChinese

+0

@HackedByChinese: Ich bin sicher, dass es etwas ist, das hinzugefügt werden könnte, aber da es einen vorhandenen Workaround gibt, der sowohl einfach als auch 100% effektiv ist Funktionalität), es ist wahrscheinlich nicht wahrscheinlich, dass wir in naher Zukunft so etwas wie "TEntity " sehen werden;) –

0

Wenn die Id Arten wichtig in der Association Definition sind, könnten Sie eine umschließende „Kontext“ erstellen:

public static partial class EntityIds<TId1, TId2> { 

    public class Association<TEntity1, TEntity2> 
     where TEntity1 : Entity<TId1> 
     where TEntity2 : Entity<TId2> 
    { 
     // ... 
    } 

} 

diese Weise die Association Erklärung Klasse ist noch verständlich, und es behält die notwendigen Typargumente für seine Typparameter.

Ein Factory-Methode konnte man mit dem normalen Fall helfen:

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

Es, der wie zu viel sieht, und wenn man anders nicht Entität Spezialisierungen haben, können Sie den Verein Modell:

public class Association<TId1, TId2> 
{ 
    // ... 
    Entity<TId1> Entity1 { get; set; } 
    Entity<TId2> Entity2 { get; set; } 
    // ... 
} 
Verwandte Themen