thể trùng lặp:
Solution for overloaded operator constraint in .NET genericsXác định một generic mà thực hiện các nhà điều hành +
Tôi có một vấn đề tôi đang làm việc trên, hiện nay nó đang làm việc cho int
s nhưng tôi muốn nó để làm việc cho tất cả các lớp có thể được thêm bằng toán tử +
. Có cách nào để xác định điều này trong chung chung? Ví dụ:
public List<T> Foo<T>() where T : ISummable
Có cách nào để thực hiện việc này không?
EDIT:
Hiệu suất truyền trong đại biểu để thực hiện tổng hợp thay vì sử dụng + = với loại Int chậm nhất là 540%. Điều tra giải pháp có thể khác
Giải pháp cuối cùng:
Cảm ơn tất cả các đề xuất của bạn. Tôi đã kết thúc với một giải pháp mà không phải là quá chậm và thực thi việc kiểm tra tại thời gian biên dịch. Tôi không thể lấy hết tín dụng như một đồng nghiệp đã giúp tôi đạt được điều này. Dù sao, ở đây là:
Thực hiện một giao diện với tất cả các nhà khai thác cần thiết trên đó theo hình thức chức năng
public interface IFoo<InputType, OutputType>
{
//Adds A to B and returns a value of type OutputType
OutputType Add(InputType a, InputType b);
//Subtracts A from B and returns a value of type OutputType
OutputType Subtract(InputType a, InputType b);
}
Tạo lớp bạn muốn xác định, nhưng thay vì mệnh đề ở đâu, sử dụng một sự phụ thuộc được tiêm vào trong giao diện IFoo. OutputType thường sẽ tăng gấp đôi vì bản chất của các phép toán là toán học.
public class Bar<T>
{
private readonly IFoo<T,double> _operators;
public Bar(IFoo<T, double> operators)
{
_operators = operators;
}
}
bây giờ khi bạn sử dụng lớp này, bạn xác định các quy tắc cho hoạt động như thế này:
private class Foo : IFoo<int, double>
{
public double Add(int a, int b)
{
return (double)(a+b);
}
public double Subtract(int a, int b)
{
return (double)(a-b);
}
}
sau đó bạn sẽ sử dụng nó như thế này:
Foo inttoDoubleOperations = new Foo();
Bar myClass = new Bar(Foo);
như vậy tất cả các hoạt động được thực thi tại thời gian biên dịch :)
tận hưởng!
Không, không trực tiếp. Có một bài viết trên CodeProject tuy nhiên mô phỏng này. – leppie
Cảm ơn bạn đã trả lời. Bạn có thể gửi cho tôi một liên kết đến giải pháp không? – TerrorAustralis
Tại sao không có phương pháp trong ISummable có thể thêm hai T chẳng hạn như T Thêm (T đầu tiên, T giây)? Sử dụng toán tử + để bổ sung IMO sẽ liên quan đến sự phản chiếu gọi phương thức op_Addition. –
VinayC