2017-07-19 5 views
2

Ich benutze Nsubstitute für Spott. Zur Reduzierung der Code Ich möchte eine generische Klasse schreiben, die eine generische Attribut täuscht:Nsubstitute: So erstellen Sie eine Fälschung in einer generischen Klasse

public class Tester<TValue> 
    where TValue: IValue 
{ 
    // this is used inside the class in other methods 
    private TValue CreateValue() 
    { 
     return Substitute.For<TValue>(); // here the compiler has an error 
    } 
} 

Dieser Code gibt einen Compiler-Fehler an der markierten Stelle:

Der Typ ‚TValue‘ muss ein Referenztyp sein um es als Parameter ‚T‘ verwendet in der generischen Art oder Methode ‚Substitute.For (params Objekt [])‘

Dies scheint offensichtlich, weil die Umsetzung der Substitute Klasse sieht wie folgt aus:

public static class Substitute 
{ 
    public static T For<T>(params object[] constructorArguments) where T : class; 
} 

Was heißt ich frage mich, warum dann ein solcher Code möglich ist: Substitute.For<IValue>() und keinen Fehler machen. Kann jemand erklären, wie man die generische Klasse mit dem Fälschen richtig macht?

Antwort

1

Das sollte unter Code arbeiten:

public class Tester<TValue> 
    where TValue : class, IValue 
{ 
    // this is used inside the class in other methods 
    private TValue CreateValue() 
    { 
     return Substitute.For<TValue>(); // here the compiler has an error 
    } 
} 

The type must be a reference type in order to use it as parameter 'T' in the generic type or method lesenswert sein kann.

Der Grund dafür ist, dass Substitute.For einen Referenztyp angibt (class). Daher müssen alle generischen Aufrufer (wie Sie selbst) dieselbe Einschränkung class angeben.

+0

Vielen Dank für Ihre Antwort. Ich habe die Einschränkung gesehen, dass NS Substitute eine Klasse als generischen Parameter benötigt. Ich fragte mich, ob es möglich ist, eine Schnittstelle mit 'Substitute.For ()' zu verwenden. Für meinen Fall ist es nicht möglich, den allgemeinen Parameter 'TValue' auf eine Klasse zu beschränken, wie ich sie für Schnittstellen benötige. – scher

+0

Können Sie Ihren Beitrag mit Ihrer Schnittstellendefinition (z. B. Datei) für 'IValue' aktualisieren, und auch die Dateien für jede Klasse/Struktur, die' IValue' implementiert? – mjwills

+0

Beachten Sie, dass "Klasse" im Kontext meines Codebeispiels nicht "Klasse statt Schnittstelle" bedeutet, sondern "Klasse statt Struktur". Hast du meinen obigen Code für deine Zwecke benutzt? Hat es funktioniert? – mjwills

Verwandte Themen