여러 제약 조건이있는 일반적인 방법


251

두 개의 일반 매개 변수가있는 일반 방법이 있습니다. 아래 코드를 컴파일하려고 시도했지만 작동하지 않습니다. .NET 제한입니까? 다른 매개 변수에 대해 여러 제약 조건을 가질 수 있습니까?

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

답변:


402

이 작업을 수행하는 것이 가능합니다. 구문이 약간 잘못되었습니다. where쉼표로 구분하지 않고 각 제한 조건마다 가 필요합니다 .

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

8

@LukeH의 다른 대답과 함께 주요 답변 외에도 클래스 대신 여러 인터페이스를 사용할 수 있습니다. 이와 같은 (하나의 클래스와 n 카운트 인터페이스)

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

또는

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

1

@LukeH의 주요 답변 외에도 종속성 주입에 문제가 있으며이 문제를 해결하는 데 시간이 걸렸습니다. 같은 문제에 직면 한 사람들을 위해 공유 할 가치가 있습니다.

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

이 방법으로 해결됩니다. 컨테이너 / 서비스에서 키는 typeof이고 쉼표 (,)

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

이것은이 답변 에서 언급되었습니다 .


2
이 답변은 유형 제약 조건과 전혀 관련이 없습니다. 바인딩되지 않은 제네릭 형식과 C #에서 철자를 쓰는 방법에 관한 것입니다. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.