Metode generik dengan banyak kendala


251

Saya memiliki metode generik yang memiliki dua parameter umum. Saya mencoba mengkompilasi kode di bawah ini tetapi tidak berhasil. Apakah ini batasan .NET? Apakah mungkin untuk memiliki beberapa batasan untuk parameter yang berbeda?

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

Jawaban:


402

Dimungkinkan untuk melakukan ini, Anda baru saja mendapatkan sintaks yang sedikit salah. Anda memerlukan tanda whereuntuk setiap kendala alih-alih memisahkannya dengan koma:

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

8

Selain jawaban utama oleh @LukeH dengan penggunaan lain, kita dapat menggunakan beberapa antarmuka, bukan kelas. (Satu kelas dan n hitung antarmuka) seperti ini

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

atau

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

1

Selain jawaban utama oleh @LukeH, saya memiliki masalah dengan injeksi ketergantungan, dan butuh beberapa waktu untuk memperbaikinya. Layak untuk dibagikan, bagi mereka yang menghadapi masalah yang sama:

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

Ini dipecahkan dengan cara ini. dalam wadah / layanan kuncinya adalah typeof dan koma (,)

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

Ini disebutkan dalam jawaban ini .


2
Jawaban ini tidak terkait dengan batasan tipe sama sekali. Ini adalah tentang tipe generik yang tidak terikat dan bagaimana mengejanya dalam C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.