Generische Methode mit mehreren Einschränkungen


251

Ich habe eine generische Methode, die zwei generische Parameter hat. Ich habe versucht, den folgenden Code zu kompilieren, aber es funktioniert nicht. Ist es eine .NET-Einschränkung? Ist es möglich, mehrere Einschränkungen für verschiedene Parameter zu haben?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass

Antworten:


402

Es ist möglich, dies zu tun, Sie haben gerade die Syntax etwas falsch. Sie benötigen wherefür jede Einschränkung ein, anstatt sie durch ein Komma zu trennen:

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass

8

Zusätzlich zur Hauptantwort von @LukeH mit einer anderen Verwendung können wir mehrere Schnittstellen anstelle der Klasse verwenden. (Eine Klasse und n Anzahl Schnittstellen) wie folgt

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, IMyOtherClass, IMyAnotherClass

oder

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : IMyClass,IMyOtherClass

1

Zusätzlich zur Hauptantwort von @LukeH habe ich ein Problem mit der Abhängigkeitsinjektion, und ich habe einige Zeit gebraucht, um dies zu beheben. Es lohnt sich zu teilen, für diejenigen, die das gleiche Problem haben:

public interface IBaseSupervisor<TEntity, TViewModel> 
    where TEntity : class
    where TViewModel : class

Es ist auf diese Weise gelöst. In Containern / Diensten ist der Schlüssel typeof und das Komma (,)

services.AddScoped(typeof(IBaseSupervisor<,>), typeof(BaseSupervisor<,>));

Dies wurde in dieser Antwort erwähnt .


2
Diese Antwort bezieht sich überhaupt nicht auf Typeinschränkungen. Es geht um ungebundene generische Typen und wie man sie in C # buchstabiert. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.