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
Martin
sumber

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
LukeH
sumber
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
Hamit YILDIRIM
sumber
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 .

maytham-ɯɐɥʇʎɐɯ
sumber
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