OK Tôi đang tìm một số đầu vào, tôi khá chắc chắn điều này hiện không được hỗ trợ trong .NET 3.5 nhưng ở đây đi.Làm thế nào để làm việc xung quanh giới hạn trong các ràng buộc loại chung trong C#?
Tôi muốn yêu cầu một kiểu generic thông qua vào lớp học của tôi để có một constructor như thế này:
new(IDictionary<string,object>)
vì vậy lớp sẽ trông như thế này
public MyClass<T> where T : new(IDictionary<string,object>)
{
T CreateObject(IDictionary<string,object> values)
{
return new T(values);
}
}
Nhưng trình biên dịch không hỗ trợ điều này, nó không thực sự biết những gì tôi yêu cầu.
Một số bạn có thể hỏi, tại sao bạn muốn làm điều này? Vâng tôi đang làm việc trên một dự án vật nuôi của một ORM vì vậy tôi nhận được các giá trị từ DB và sau đó tạo đối tượng và tải các giá trị.
Tôi nghĩ rằng nó sẽ sạch hơn để cho phép đối tượng chỉ tạo ra chính nó với các giá trị tôi đưa ra. Theo như tôi có thể nói tôi có hai lựa chọn:
1) Sử dụng phản chiếu (mà tôi đang cố tránh) để lấy mảng PropertyInfo [] và sau đó sử dụng để tải các giá trị.
2) yêu cầu T để hỗ trợ một giao diện như sau:
ILoadValues public interface { trống LoadValues (giá trị IDictionary); }
và sau đó làm điều này
public MyClass<T> where T:new(),ILoadValues
{
T CreateObject(IDictionary<string,object> values)
{
T obj = new T();
obj.LoadValues(values);
return obj;
}
}
Tôi có vấn đề với giao diện Tôi đoán là triết học, tôi không thực sự muốn để lộ một phương pháp nào để mọi người tải các giá trị. Sử dụng các nhà xây dựng ý tưởng là nếu tôi có một đối tượng như thế này
namespace DataSource.Data
{
public class User
{
protected internal User(IDictionary<string,object> values)
{
//Initialize
}
}
}
Chừng nào các MyClass<T>
là trong cùng một assembly các nhà xây dựng sẽ được cung cấp. Cá nhân tôi nghĩ rằng ràng buộc Loại theo ý kiến của tôi nên hỏi (Tôi có quyền truy cập vào nhà xây dựng này không? Tôi làm, tuyệt vời!)
Bất kỳ đầu vào nào cũng được chào đón.
Tôi đặt bạn làm câu trả lời vì tôi không bao giờ biết bạn có thể ẩn một triển khai giao diện bằng cách tuyên bố rõ ràng nó. Hoặc ít nhất nó đã không bấm cho đến khi bạn đã viết nó. Cảm ơn! – Jose