Tôi đang làm việc với một công việc cụ thể .NET plattform, được biên dịch trước chứ không phải OpenSource. Đối với một số tác vụ tôi cần phải mở rộng lớp này, nhưng không cần phải thừa kế từ nó. Tôi chỉ muốn thêm một phương thức.Làm cách nào để viết một phương thức mở rộng cho một kiểu chung với các ràng buộc về các tham số kiểu?
Lúc đầu, tôi muốn cho bạn thấy một dummycode lớp hiện có:
public class Matrix<T> where T : new() {
...
public T values[,];
...
}
tôi muốn mở rộng lớp này theo cách sau:
public static class MatrixExtension {
public static T getCalcResult<T>(this Matrix<T> mat) {
T result = 0;
...
return result;
}
}
Tôi đã có cú pháp này từ nhiều google liên kết để không biết liệu nó có đúng không. Trình biên dịch nói với tôi không có lỗi, nhưng cuối cùng nó không hoạt động. Cuối cùng, tôi muốn gọi hàm này theo cách sau:
Matrix<int> m = new Matrix<int>();
...
int aNumber = m.getCalcResult();
Vì vậy, bất kỳ ai có ý tưởng? Cảm ơn sự giúp đỡ của bạn!
Trân Nem
Tại sao bạn nghĩ nó không hoạt động? Nó có ném một ngoại lệ không? –
Đây là cách thích hợp để sử dụng một phương pháp mở rộng, nhưng thay vì 'T result = 0' bạn nên có' T result = default (T) 'vì T ban đầu không bị ràng buộc với' int'.Ngoài ra, bạn nên kiểm tra để chắc chắn rằng bạn có câu lệnh sử dụng để bao gồm lớp MatrixExtension của bạn. Bạn luôn có thể kiểm tra bằng cách gọi trực tiếp 'MatrixExtension.getCalcResult (m)' để xem nó có hoạt động hay không. –
Ít nhất IDE bắt buộc tôi gọi phương thức như sau: m.getCalcResult(); Nhưng khi tôi cố gắng biên dịch, tôi gặp lỗi khác: > 'Ma trận ' không chứa định nghĩa cho 'GetValue' và không có phương pháp mở rộng 'GetValue' chấp nhận đối số đầu tiên của loại 'Matrix ' tìm thấy (bạn đang thiếu một chỉ thị bằng cách sử dụng hoặc một tham chiếu lắp ráp?) Bằng cách này, cách gọi phương thức không có ý nghĩa vì thông số T chung đã được gán. –