Birden fazla kısıtlamaya sahip genel yöntem


251

İki genel parametreleri olan genel bir yöntem var. Aşağıdaki kodu derlemeye çalıştım ama çalışmıyor. Bir .NET sınırlaması mı? Farklı parametre için birden fazla kısıtlama olması mümkün müdür?

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

Yanıtlar:


402

Bunu yapmak mümkündür, sentaksı biraz yanlış yaptın. Bir ihtiyaç whereoldukça virgülle ayırarak birden her kısıtlama için:

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

8

@LukeH'nin başka bir kullanımla ana cevabına ek olarak, sınıf yerine birden fazla arayüz kullanabiliriz. (Bir sınıf ve n sayım arayüzü) böyle

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

veya

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

1

@LukeH tarafından verilen ana cevaba ek olarak, bağımlılık enjeksiyonuyla ilgili bir sorunum var ve bunu düzeltmek biraz zaman aldı. Aynı sorunla karşılaşanlar için paylaşmaya değer:

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

Bu şekilde çözüldü. kapsayıcılarda / hizmetlerde anahtar typeof ve virgül (,)

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

Bu cevapta bundan bahsedildi .


2
Bu yanıt, tür kısıtlamaları ile ilgili değildir. Bu, bağlı olmayan genel türler ve C # 'da nasıl heceleneceği ile ilgilidir. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.