2010-10-17 11 views
5

Also, ich habe ein kleines Problem hier.Code Contracts: ContractClassFor im Umgang mit einer generischen abstrakten Klasse?

Angenommen, ich habe:

public class Repository<TEntity> 
    where TEntity : class 
{ 
    public abstract void Add(TEntity entity); 

    // ...and so on... 
} 

Und jetzt möchte ich einen Vertrag Klasse definieren, etwa so:

public class RepositoryContracts<TEntity> : Repository<TEntity> 
    where TEntity : class 
{ 
    public void Add(TEntity entity) 
    { 
     Contract.Requires(entity != null); 
    } 

    // ...etc... 
} 

Nun würde ich diese Klassen mit ContractClassAttribute und ContractClassForAttribute markieren müssen. Problem ist, das wird nicht funktionieren:

[ContractClassFor(typeof(Repository<TEntity>))] // what is TEntity?! error! 

Also, die Frage läuft darauf hinaus: Wie verknüpfe ich diese zwei Klassen zusammen diese Attribute verwenden, wenn sie sind Generika?

Antwort

5

Es ist ein Duplikat von this question, irgendwie.

Die typeof (Repository <>) Syntax schien für mich nicht zu funktionieren, aber es stellt sich heraus, dass typeof (Repository <,>) den Trick macht, da es zwei Typparameter gibt.

Schließen Sie die Frage und fügen Sie the previous one einen Kommentar hinzu.

+0

Ich habe das gleiche Problem, das Entfernen der generischen 'TEntity' löste es, aber wenn ich diese' Schnittstelle' in einer anderen 'Klasse' implementiere, beschwert es sich, dass' class' oder 'interface' keine IRepository Methoden implementiert . Irgendwelche Ideen ? –

Verwandte Themen