Thực ra, tôi nên hỏi: làm cách nào tôi có thể thực hiện điều này và vẫn tuân thủ CLS? Bởi vì cách duy nhất tôi có thể nghĩ về việc này là như sau, nhưng sử dụng hoặc __makeref
, FieldInfo.SetValueDirect
hoặc chỉ System.TypedReference
nói chung vô hiệu hóa tuân thủ CLS.Tôi có thể đặt giá trị trên cấu trúc thông qua phản xạ không có quyền anh không?
// code illustrating the issue:
TestFields fields = new TestFields { MaxValue = 1234 }; // test struct with one field
FieldInfo info = fields.GetType().GetField("MaxValue"); // get the FieldInfo
// actual magic, no boxing, not CLS compliant:
TypedReference reference = __makeref(fields);
info.SetValueDirect(reference, 4096);
Các đối tác phù hợp của SetValueDirect
là SetValue
, nhưng phải mất một đối tượng như mục tiêu, do đó cấu trúc của tôi sẽ được đóng hộp, làm cho tôi đặt một giá trị trên một bản sao, không phải là biến ban đầu.
Một đối tác chung cho SetValue
không tồn tại như tôi biết. Có cách nào khác để thiết lập các lĩnh vực của một (tham chiếu đến a) struct thông qua sự phản ánh?
Có lẽ tôi không hiểu CLSCompliancy, tôi nghĩ rằng nó có nghĩa là bạn không thể _use_ tính năng không tuân thủ. Nếu điều này được cho phép, nó làm cho mọi thứ dễ dàng hơn rất nhiều. – Abel
@Abel: CLS Compliant có nghĩa là các thành viên công cộng của bạn chỉ tham khảo các loại tuân thủ CLS. Nó không nói gì về những gì có trong các thành viên của bạn. – Gabe
Rất tiếc, nhận xét của tôi đã bị mất. Có, tôi nhận thấy, rõ ràng từ [ba dấu đầu dòng trên MSDN về Tuân thủ CLS] (http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx). Tuy nhiên nó cảm thấy hết sức kỳ lạ mà tôi cần một [từ khóa không có giấy tờ __makeref] (http://www.codeproject.com/Articles/38695/UnCommon-C-keywords-A-Look#makref) để có được điều này để làm việc. – Abel