Phương thức chung với nhiều ràng buộc


251

Tôi có một phương thức chung có hai tham số chung. Tôi đã cố gắng biên dịch mã dưới đây nhưng nó không hoạt động. Có phải là một giới hạn .NET? Có thể có nhiều ràng buộc cho các tham số khác nhau?

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

Câu trả lời:


402

Có thể làm điều này, bạn vừa có cú pháp hơi sai. Bạn cần một whereràng buộc cho từng ràng buộc thay vì phân tách chúng bằng dấu phẩy:

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

8

Ngoài câu trả lời chính của @LukeH với một cách sử dụng khác, chúng ta có thể sử dụng nhiều giao diện thay vì lớp. (Một lớp và n giao diện đếm) như thế này

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

hoặc là

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

1

Ngoài câu trả lời chính của @LukeH, tôi có vấn đề với việc tiêm phụ thuộc và tôi phải mất một thời gian để khắc phục điều này. Rất đáng để chia sẻ, cho những người phải đối mặt với cùng một vấn đề:

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

Nó được giải quyết theo cách này. trong các thùng chứa / dịch vụ, khóa là typeof và dấu phẩy (,)

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

Điều này đã được đề cập trong câu trả lời này .


2
Câu trả lời này không liên quan đến các ràng buộc kiểu nào cả. Đó là về các loại chung không liên kết và cách đánh vần chúng trong C #. stackoverflow.com/a/2173115/2157640 stackoverflow.com/a/6607299/2157640
Palec
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.