Właściwie powinienem był zapytać: jak mogę to zrobić: i pozostają zgodne z CLS? Ponieważ jedyny sposób, w jaki mogę to zrobić, jest następujący, ale użycie albo __makeref
, FieldInfo.SetValueDirect
lub po prostu System.TypedReference
generalnie unieważnia zgodność CLS.Czy mogę ustawić wartość na struct przez odbicie bez boksowania?
// 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);
Odpowiednikiem zgodny z SetValueDirect
jest SetValue
, ale zajmuje obiekt jako cel, stąd moja struct zostaną zapakowane, co mnie ustawienie wartości na kopii, a nie zmiennej pierwotnej.
Ogólny odpowiednik dla SetValue
nie istnieje, o ile wiem. Czy istnieje inny sposób ustawiania pola (odniesienie do) struktury poprzez odbicie?
Może nie rozumiem CLSCompliancy, myślałem, że oznacza to, że nie można używać \ "niezgodnych funkcji. Jeśli jest to dozwolone, to naprawdę ułatwia to zadanie. – Abel
@Abel: Zgodność z CLS oznacza, że Twoi członkowie publiczni odwołują się do typów zgodnych z CLS. Nie mówi nic o tym, co zawiera się w twoich członkach. – Gabe
Ups, moja edycja komentarza została utracona. Tak, zauważyłem, wynika to z [trzech pierwszych naboi na MSDN na zgodność z CLS] (http://msdn.microsoft.com/en-us/library/bhc3fa7f.aspx). Nadal jest strasznie dziwne, że potrzebuję [nieudokumentowanego słowa kluczowego __makeref] (http://www.codeproject.com/Articles/38695/UnCommon-C-keywords-A-Look#makref), aby to zadziałało. – Abel