Metoda ogólna z wieloma ograniczeniami

251

Mam ogólną metodę, która ma dwa ogólne parametry. Próbowałem skompilować poniższy kod, ale to nie działa. Czy jest to ograniczenie .NET? Czy można mieć wiele ograniczeń dla różnych parametrów?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass
Jaskółka oknówka
źródło

Odpowiedzi:

402

Można to zrobić, po prostu masz trochę niepoprawną składnię. Potrzebujesz wherekażdego ograniczenia zamiast oddzielania ich przecinkiem:

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass
Łukasz
źródło
8

Oprócz głównej odpowiedzi @LukeH przy innym użyciu, możemy użyć wielu interfejsów zamiast klasy. (Interfejsy jednej klasy i liczby n) w ten sposób

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

lub

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : IMyClass,IMyOtherClass
Hamit YILDIRIM
źródło
1

Oprócz głównej odpowiedzi @LukeH mam problem z wstrzykiwaniem zależności i zajęło mi to trochę czasu, aby to naprawić. Warto podzielić się, dla tych, którzy mają ten sam problem:

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

Zostało to rozwiązane w ten sposób. w kontenerach / usługach kluczem jest typeof i przecinek (,)

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

Zostało to wspomniane w tej odpowiedzi .

maytham-ɯɐɥʇʎɐɯ
źródło
2
Ta odpowiedź w ogóle nie jest związana z ograniczeniami typu. Chodzi o niezwiązane rodzaje ogólne i jak je przeliterować w C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec